From 7817e5719e1be7e1c7ffacf2de76a8fd6307480a Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Fri, 8 May 2020 22:22:54 +0200 Subject: [PATCH 001/150] Bump wasmtime again (#5950) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update wasmtime (#5822) * update wasmtime * update tests * Update client/executor/wasmtime/src/host.rs Co-Authored-By: Bastian Köcher * wip * use master-candidate * update with patches * update versions Co-authored-by: Bastian Köcher * Bump version * Added parallel execution test Co-authored-by: Nikolay Volf Co-authored-by: Bastian Köcher --- Cargo.lock | 158 ++++++++++-------- client/executor/src/integration_tests/mod.rs | 32 +++- client/executor/wasmtime/Cargo.toml | 10 +- client/executor/wasmtime/src/host.rs | 2 +- client/executor/wasmtime/src/imports.rs | 145 ++++++++-------- .../executor/wasmtime/src/instance_wrapper.rs | 48 ++++-- .../src/instance_wrapper/globals_snapshot.rs | 9 +- client/executor/wasmtime/src/runtime.rs | 2 +- 8 files changed, 231 insertions(+), 175 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c7b9a9a4b..42e0ed9db7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,6 +300,12 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" +[[package]] +name = "base64" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3" + [[package]] name = "bincode" version = "1.2.1" @@ -721,18 +727,18 @@ checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" [[package]] name = "cranelift-bforest" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a9c21f8042b9857bda93f6c1910b9f9f24100187a3d3d52f214a34e3dc5818" +checksum = "d4425bb6c3f3d2f581c650f1a1fdd3196a975490149cf59bea9d34c3bea79eda" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7853f77a6e4a33c67a69c40f5e1bb982bd2dc5c4a22e17e67b65bbccf9b33b2e" +checksum = "d166b289fd30062ee6de86284750fc3fe5d037c6b864b3326ce153239b0626e1" dependencies = [ "byteorder 1.3.4", "cranelift-bforest", @@ -741,6 +747,7 @@ dependencies = [ "cranelift-entity", "gimli", "log", + "regalloc", "serde", "smallvec 1.3.0", "target-lexicon", @@ -749,9 +756,9 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084cd6d5fb0d1da28acd72c199471bfb09acc703ec8f3bf07b1699584272a3b9" +checksum = "02c9fb2306a36d41c5facd4bf3400bc6c157185c43a96eaaa503471c34c5144b" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -759,24 +766,24 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "701b599783305a58c25027a4d73f2d6b599b2d8ef3f26677275f480b4d51e05d" +checksum = "44e0cfe9b1f97d9f836bca551618106c7d53b93b579029ecd38e73daa7eb689e" [[package]] name = "cranelift-entity" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88e792b28e1ebbc0187b72ba5ba880dad083abe9231a99d19604d10c9e73f38" +checksum = "926a73c432e5ba9c891171ff50b75e7d992cd76cd271f0a0a0ba199138077472" dependencies = [ "serde", ] [[package]] name = "cranelift-frontend" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518344698fa6c976d853319218415fdfb4f1bc6b42d0b2e2df652e55dff1f778" +checksum = "e45f82e3446dd1ebb8c2c2f6a6b0e6cd6cd52965c7e5f7b1b35e9a9ace31ccde" dependencies = [ "cranelift-codegen", "log", @@ -786,9 +793,9 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32daf082da21c0c05d93394ff4842c2ab7c4991b1f3186a1d952f8ac660edd0b" +checksum = "488b5d481bb0996a143e55a9d1739ef425efa20d4a5e5e98c859a8573c9ead9a" dependencies = [ "cranelift-codegen", "raw-cpuid", @@ -797,9 +804,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.59.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2aa816f554a3ef739a5d17ca3081a1f8983f04c944ea8ff60fb8d9dd8cd2d7b" +checksum = "00aa8dde71fd9fdb1958e7b0ef8f524c1560e2c6165e4ea54bc302b40551c161" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -807,7 +814,7 @@ dependencies = [ "log", "serde", "thiserror", - "wasmparser", + "wasmparser 0.51.4", ] [[package]] @@ -1277,11 +1284,10 @@ dependencies = [ [[package]] name = "faerie" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b9ed6159e4a6212c61d9c6a86bee01876b192a64accecf58d5b5ae3b667b52" +checksum = "dfef65b0e94693295c5d2fe2506f0ee6f43465342d4b5331659936aee8b16084" dependencies = [ - "anyhow", "goblin", "indexmap", "log", @@ -2724,7 +2730,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f7f3f79f060864db0317cc47641b7d35276dee52a0ffa91553fbd0c153863a3" dependencies = [ - "base64", + "base64 0.11.0", "byteorder 1.3.4", "bytes 0.5.4", "fnv", @@ -3865,16 +3871,11 @@ dependencies = [ [[package]] name = "object" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea44a4fd660ab0f38434934ca0212e90fbeaaee54126ef20a3451c30c95bafae" +checksum = "e5666bbb90bc4d1e5bdcb26c0afda1822d25928341e9384ab187a9b37ab69e36" dependencies = [ - "flate2", - "goblin", - "parity-wasm 0.41.0", - "scroll", "target-lexicon", - "uuid", ] [[package]] @@ -5609,6 +5610,17 @@ dependencies = [ "syn 1.0.17", ] +[[package]] +name = "regalloc" +version = "0.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b27b256b41986ac5141b37b8bbba85d314fbf546c182eb255af6720e07e4f804" +dependencies = [ + "log", + "rustc-hash", + "smallvec 1.3.0", +] + [[package]] name = "regex" version = "1.3.6" @@ -5713,7 +5725,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" dependencies = [ - "base64", + "base64 0.11.0", "blake2b_simd", "constant_time_eq", "crossbeam-utils", @@ -5752,7 +5764,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0d4a31f5d68413404705d6982529b0e11a9aacd4839d1d6222ee3b8cb4015e1" dependencies = [ - "base64", + "base64 0.11.0", "log", "ring", "sct", @@ -7201,7 +7213,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c9dab3f95c9ebdf3a88268c19af668f637a3c5039c2c56ff2d40b1b2d64a25b" dependencies = [ - "base64", + "base64 0.11.0", "bytes 0.5.4", "flate2", "futures 0.3.4", @@ -8264,9 +8276,9 @@ version = "1.0.6" [[package]] name = "substrate-wasmtime" -version = "0.13.0-threadsafe.1" +version = "0.16.0-threadsafe.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e512629525ecfe43bffe1f3d9e6bb0f08bf01155288ef27fcaae4ea086e4a9d" +checksum = "7b40a6f3d5d3c00754e348863fead4f37763c32eedf950f5b23df87769882311" dependencies = [ "anyhow", "backtrace", @@ -8276,20 +8288,20 @@ dependencies = [ "region", "rustc-demangle", "substrate-wasmtime-jit", + "substrate-wasmtime-profiling", "substrate-wasmtime-runtime", "target-lexicon", - "wasmparser", + "wasmparser 0.52.2", "wasmtime-environ", - "wasmtime-profiling", "wat", "winapi 0.3.8", ] [[package]] name = "substrate-wasmtime-jit" -version = "0.13.0-threadsafe.1" +version = "0.16.0-threadsafe.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20de5564886d2bcffdd351c9cd114ceb50758aa58eac3cedb14faabf7f93b91" +checksum = "09712de4f56a2c2912bee7763b0877d17d72cfb2237987d63ab78956907e7692" dependencies = [ "anyhow", "cfg-if", @@ -8298,23 +8310,44 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", + "gimli", + "log", "more-asserts", "region", + "substrate-wasmtime-profiling", "substrate-wasmtime-runtime", "target-lexicon", "thiserror", - "wasmparser", + "wasmparser 0.52.2", "wasmtime-debug", "wasmtime-environ", - "wasmtime-profiling", "winapi 0.3.8", ] +[[package]] +name = "substrate-wasmtime-profiling" +version = "0.16.0-threadsafe.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31505dd221f001634a54ea51472bc0058bcbde9186eaf8dd31d0859638121385" +dependencies = [ + "anyhow", + "cfg-if", + "gimli", + "lazy_static", + "libc", + "object", + "scroll", + "serde", + "substrate-wasmtime-runtime", + "target-lexicon", + "wasmtime-environ", +] + [[package]] name = "substrate-wasmtime-runtime" -version = "0.13.0-threadsafe.1" +version = "0.16.0-threadsafe.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d08846f04293a7fc27eeb30f06262ca2e1b4ee20f5192cec1f3ce201e08ceb8" +checksum = "3708081f04d9216d4dee487abf94872065f930cf82e287bd0c5bdb57895460ba" dependencies = [ "backtrace", "cc", @@ -8327,7 +8360,6 @@ dependencies = [ "region", "thiserror", "wasmtime-environ", - "wasmtime-profiling", "winapi 0.3.8", ] @@ -9085,12 +9117,6 @@ dependencies = [ "percent-encoding 2.1.0", ] -[[package]] -name = "uuid" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" - [[package]] name = "vcpkg" version = "0.2.8" @@ -9334,11 +9360,17 @@ version = "0.51.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" +[[package]] +name = "wasmparser" +version = "0.52.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733954023c0b39602439e60a65126fd31b003196d3a1e8e4531b055165a79b31" + [[package]] name = "wasmtime-debug" -version = "0.12.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d3d007436043bf55ec252d2f4dc1d35834157b5e2f148da839ca502e611cfe1" +checksum = "d39ba645aee700b29ff0093028b4123556dd142a74973f04ed6225eedb40e77d" dependencies = [ "anyhow", "faerie", @@ -9346,18 +9378,18 @@ dependencies = [ "more-asserts", "target-lexicon", "thiserror", - "wasmparser", + "wasmparser 0.51.4", "wasmtime-environ", ] [[package]] name = "wasmtime-environ" -version = "0.12.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f3dea0e60c076dd0da27fa10c821323903c9554c617ed32eaab8e7a7e36c89" +checksum = "ed54fd9d64dfeeee7c285fd126174a6b5e6d4efc7e5a1566fdb635e60ff6a74e" dependencies = [ "anyhow", - "base64", + "base64 0.12.0", "bincode", "cranelift-codegen", "cranelift-entity", @@ -9374,27 +9406,11 @@ dependencies = [ "sha2", "thiserror", "toml", - "wasmparser", + "wasmparser 0.51.4", "winapi 0.3.8", "zstd", ] -[[package]] -name = "wasmtime-profiling" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "984d29c8add3381e60d649f4e3e2a501da900fc2d2586e139502eec32fe0ebc8" -dependencies = [ - "gimli", - "goblin", - "lazy_static", - "libc", - "object", - "scroll", - "serde", - "target-lexicon", -] - [[package]] name = "wast" version = "13.0.0" diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 2e62e06015..886860d7fe 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -92,9 +92,8 @@ fn call_not_existing_function(wasm_method: WasmExecutionMethod) { "\"Trap: Trap { kind: Host(Other(\\\"Function `missing_external` is only a stub. Calling a stub is not allowed.\\\")) }\"" ), #[cfg(feature = "wasmtime")] - WasmExecutionMethod::Compiled => assert_eq!( - &format!("{:?}", e), - "\"Wasm execution trapped: call to a missing function env:missing_external\"" + WasmExecutionMethod::Compiled => assert!( + format!("{:?}", e).contains("Wasm execution trapped: call to a missing function env:missing_external") ), } } @@ -121,9 +120,8 @@ fn call_yet_another_not_existing_function(wasm_method: WasmExecutionMethod) { "\"Trap: Trap { kind: Host(Other(\\\"Function `yet_another_missing_external` is only a stub. Calling a stub is not allowed.\\\")) }\"" ), #[cfg(feature = "wasmtime")] - WasmExecutionMethod::Compiled => assert_eq!( - &format!("{:?}", e), - "\"Wasm execution trapped: call to a missing function env:yet_another_missing_external\"" + WasmExecutionMethod::Compiled => assert!( + format!("{:?}", e).contains("Wasm execution trapped: call to a missing function env:yet_another_missing_external") ), } } @@ -623,3 +621,25 @@ fn heap_is_reset_between_calls(wasm_method: WasmExecutionMethod) { // Cal it a second time to check that the heap was freed. instance.call("check_and_set_in_heap", ¶ms).unwrap(); } + +#[test_case(WasmExecutionMethod::Interpreted)] +#[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] +fn parallel_execution(wasm_method: WasmExecutionMethod) { + let threads: Vec<_> = (0..8).map(|_| std::thread::spawn(move || { + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); + assert_eq!( + call_in_wasm( + "test_twox_128", + &[0], + wasm_method.clone(), + &mut ext, + ).unwrap(), + hex!("99e9d85137db46ef4bbea33613baafd5").to_vec().encode(), + ); + })).collect(); + + for t in threads.into_iter() { + t.join().unwrap(); + } +} diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 5b1c384141..0864c19bf0 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -21,11 +21,11 @@ sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-in sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } -wasmtime = { package = "substrate-wasmtime", version = "0.13.0-threadsafe.1" } -wasmtime_runtime = { package = "substrate-wasmtime-runtime", version = "0.13.0-threadsafe.1" } -wasmtime-environ = "0.12.0" -cranelift-wasm = "0.59.0" -cranelift-codegen = "0.59.0" +wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.2" } +wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.2" } +wasmtime-environ = "0.16" +cranelift-wasm = "0.63" +cranelift-codegen = "0.63" [dev-dependencies] assert_matches = "1.3.0" diff --git a/client/executor/wasmtime/src/host.rs b/client/executor/wasmtime/src/host.rs index 29187ac663..8c481e95c4 100644 --- a/client/executor/wasmtime/src/host.rs +++ b/client/executor/wasmtime/src/host.rs @@ -117,7 +117,7 @@ impl<'a> SandboxCapabilities for HostContext<'a> { return Err("Supervisor function returned unexpected result!".into()); } } - Err(err) => Err(err.message().to_string().into()), + Err(err) => Err(err.to_string().into()), } } } diff --git a/client/executor/wasmtime/src/imports.rs b/client/executor/wasmtime/src/imports.rs index 48299ffd62..2d9794b7ed 100644 --- a/client/executor/wasmtime/src/imports.rs +++ b/client/executor/wasmtime/src/imports.rs @@ -18,9 +18,8 @@ use crate::state_holder; use sc_executor_common::error::WasmError; use sp_wasm_interface::{Function, Value, ValueType}; use std::any::Any; -use std::rc::Rc; use wasmtime::{ - Callable, Extern, ExternType, Func, FuncType, ImportType, Limits, Memory, MemoryType, Module, + Extern, ExternType, Func, FuncType, ImportType, Limits, Memory, MemoryType, Module, Trap, Val, }; @@ -53,11 +52,11 @@ pub fn resolve_imports( let resolved = match import_ty.name() { "memory" => { memory_import_index = Some(externs.len()); - resolve_memory_import(module, import_ty, heap_pages)? + resolve_memory_import(module, &import_ty, heap_pages)? } _ => resolve_func_import( module, - import_ty, + &import_ty, host_functions, allow_missing_func_imports, )?, @@ -131,7 +130,7 @@ fn resolve_func_import( { Some(host_func) => host_func, None if allow_missing_func_imports => { - return Ok(MissingHostFuncHandler::new(import_ty).into_extern(module, func_ty)); + return Ok(MissingHostFuncHandler::new(import_ty).into_extern(module, &func_ty)); } None => { return Err(WasmError::Other(format!( @@ -163,6 +162,58 @@ struct HostFuncHandler { host_func: &'static dyn Function, } +fn call_static( + static_func: &'static dyn Function, + wasmtime_params: &[Val], + wasmtime_results: &mut [Val], +) -> Result<(), wasmtime::Trap> { + let unwind_result = state_holder::with_context(|host_ctx| { + let mut host_ctx = host_ctx.expect( + "host functions can be called only from wasm instance; + wasm instance is always called initializing context; + therefore host_ctx cannot be None; + qed + ", + ); + // `into_value` panics if it encounters a value that doesn't fit into the values + // available in substrate. + // + // This, however, cannot happen since the signature of this function is created from + // a `dyn Function` signature of which cannot have a non substrate value by definition. + let mut params = wasmtime_params.iter().cloned().map(into_value); + + std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + static_func.execute(&mut host_ctx, &mut params) + })) + }); + + let execution_result = match unwind_result { + Ok(execution_result) => execution_result, + Err(err) => return Err(Trap::new(stringify_panic_payload(err))), + }; + + match execution_result { + Ok(Some(ret_val)) => { + debug_assert!( + wasmtime_results.len() == 1, + "wasmtime function signature, therefore the number of results, should always \ + correspond to the number of results returned by the host function", + ); + wasmtime_results[0] = into_wasmtime_val(ret_val); + Ok(()) + } + Ok(None) => { + debug_assert!( + wasmtime_results.len() == 0, + "wasmtime function signature, therefore the number of results, should always \ + correspond to the number of results returned by the host function", + ); + Ok(()) + } + Err(msg) => Err(Trap::new(msg)), + } +} + impl HostFuncHandler { fn new(host_func: &'static dyn Function) -> Self { Self { @@ -171,63 +222,14 @@ impl HostFuncHandler { } fn into_extern(self, module: &Module) -> Extern { + let host_func = self.host_func; let func_ty = wasmtime_func_sig(self.host_func); - let func = Func::new(module.store(), func_ty, Rc::new(self)); - Extern::Func(func) - } -} - -impl Callable for HostFuncHandler { - fn call( - &self, - wasmtime_params: &[Val], - wasmtime_results: &mut [Val], - ) -> Result<(), wasmtime::Trap> { - let unwind_result = state_holder::with_context(|host_ctx| { - let mut host_ctx = host_ctx.expect( - "host functions can be called only from wasm instance; - wasm instance is always called initializing context; - therefore host_ctx cannot be None; - qed - ", - ); - // `into_value` panics if it encounters a value that doesn't fit into the values - // available in substrate. - // - // This, however, cannot happen since the signature of this function is created from - // a `dyn Function` signature of which cannot have a non substrate value by definition. - let mut params = wasmtime_params.iter().cloned().map(into_value); - - std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - self.host_func.execute(&mut host_ctx, &mut params) - })) - }); - - let execution_result = match unwind_result { - Ok(execution_result) => execution_result, - Err(err) => return Err(Trap::new(stringify_panic_payload(err))), - }; - - match execution_result { - Ok(Some(ret_val)) => { - debug_assert!( - wasmtime_results.len() == 1, - "wasmtime function signature, therefore the number of results, should always \ - correspond to the number of results returned by the host function", - ); - wasmtime_results[0] = into_wasmtime_val(ret_val); - Ok(()) - } - Ok(None) => { - debug_assert!( - wasmtime_results.len() == 0, - "wasmtime function signature, therefore the number of results, should always \ - correspond to the number of results returned by the host function", - ); - Ok(()) + let func = Func::new(module.store(), func_ty, + move |_, params, result| { + call_static(host_func, params, result) } - Err(msg) => Err(Trap::new(msg)), - } + ); + Extern::Func(func) } } @@ -245,25 +247,18 @@ impl MissingHostFuncHandler { } } - fn into_extern(self, module: &Module, func_ty: &FuncType) -> Extern { - let func = Func::new(module.store(), func_ty.clone(), Rc::new(self)); + fn into_extern(self, wasmtime_module: &Module, func_ty: &FuncType) -> Extern { + let Self { module, name } = self; + let func = Func::new(wasmtime_module.store(), func_ty.clone(), + move |_, _, _| Err(Trap::new(format!( + "call to a missing function {}:{}", + module, name + ))) + ); Extern::Func(func) } } -impl Callable for MissingHostFuncHandler { - fn call( - &self, - _wasmtime_params: &[Val], - _wasmtime_results: &mut [Val], - ) -> Result<(), wasmtime::Trap> { - Err(Trap::new(format!( - "call to a missing function {}:{}", - self.module, self.name - ))) - } -} - fn wasmtime_func_sig(func: &dyn Function) -> wasmtime::FuncType { let params = func .signature() diff --git a/client/executor/wasmtime/src/instance_wrapper.rs b/client/executor/wasmtime/src/instance_wrapper.rs index 469668802f..bf01896809 100644 --- a/client/executor/wasmtime/src/instance_wrapper.rs +++ b/client/executor/wasmtime/src/instance_wrapper.rs @@ -26,7 +26,7 @@ use sc_executor_common::{ util::{WasmModuleInfo, DataSegmentsSnapshot}, }; use sp_wasm_interface::{Pointer, WordSize, Value}; -use wasmtime::{Store, Instance, Module, Memory, Table, Val}; +use wasmtime::{Store, Instance, Module, Memory, Table, Val, Func, Extern, Global}; mod globals_snapshot; @@ -88,6 +88,35 @@ pub struct InstanceWrapper { _not_send_nor_sync: marker::PhantomData<*const ()>, } +fn extern_memory(extern_: &Extern) -> Option<&Memory> { + match extern_ { + Extern::Memory(mem) => Some(mem), + _ => None, + } +} + + +fn extern_global(extern_: &Extern) -> Option<&Global> { + match extern_ { + Extern::Global(glob) => Some(glob), + _ => None, + } +} + +fn extern_table(extern_: &Extern) -> Option<&Table> { + match extern_ { + Extern::Table(table) => Some(table), + _ => None, + } +} + +fn extern_func(extern_: &Extern) -> Option<&Func> { + match extern_ { + Extern::Func(func) => Some(func), + _ => None, + } +} + impl InstanceWrapper { /// Create a new instance wrapper from the given wasm module. pub fn new(module_wrapper: &ModuleWrapper, imports: &Imports, heap_pages: u32) -> Result { @@ -96,8 +125,7 @@ impl InstanceWrapper { let memory = match imports.memory_import_index { Some(memory_idx) => { - imports.externs[memory_idx] - .memory() + extern_memory(&imports.externs[memory_idx]) .expect("only memory can be at the `memory_idx`; qed") .clone() } @@ -130,8 +158,7 @@ impl InstanceWrapper { .instance .get_export(name) .ok_or_else(|| Error::from(format!("Exported method {} is not found", name)))?; - let entrypoint = export - .func() + let entrypoint = extern_func(&export) .ok_or_else(|| Error::from(format!("Export {} is not a function", name)))?; match (entrypoint.ty().params(), entrypoint.ty().results()) { (&[wasmtime::ValType::I32, wasmtime::ValType::I32], &[wasmtime::ValType::I64]) => {} @@ -164,8 +191,7 @@ impl InstanceWrapper { .get_export("__heap_base") .ok_or_else(|| Error::from("__heap_base is not found"))?; - let heap_base_global = heap_base_export - .global() + let heap_base_global = extern_global(&heap_base_export) .ok_or_else(|| Error::from("__heap_base is not a global"))?; let heap_base = heap_base_global @@ -183,7 +209,7 @@ impl InstanceWrapper { None => return Ok(None), }; - let global = global.global().ok_or_else(|| format!("`{}` is not a global", name))?; + let global = extern_global(&global).ok_or_else(|| format!("`{}` is not a global", name))?; match global.get() { Val::I32(val) => Ok(Some(Value::I32(val))), @@ -201,8 +227,7 @@ fn get_linear_memory(instance: &Instance) -> Result { .get_export("memory") .ok_or_else(|| Error::from("memory is not exported under `memory` name"))?; - let memory = memory_export - .memory() + let memory = extern_memory(&memory_export) .ok_or_else(|| Error::from("the `memory` export should have memory type"))? .clone(); @@ -213,7 +238,8 @@ fn get_linear_memory(instance: &Instance) -> Result { fn get_table(instance: &Instance) -> Option { instance .get_export("__indirect_function_table") - .and_then(|export| export.table()) + .as_ref() + .and_then(extern_table) .cloned() } diff --git a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs index a6ab3fed60..602c780f72 100644 --- a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs +++ b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs @@ -21,6 +21,7 @@ use sc_executor_common::{ use sp_wasm_interface::Value; use cranelift_codegen::ir; use cranelift_wasm::GlobalIndex; +use wasmtime_runtime::{ExportGlobal, Export}; /// A snapshot of a global variables values. This snapshot can be used later for restoring the /// values to the preserved state. @@ -37,17 +38,15 @@ impl GlobalsSnapshot { pub fn take(instance_wrapper: &InstanceWrapper) -> Result { // EVIL: // Usage of an undocumented function. - let handle = instance_wrapper.instance.handle().clone(); + let handle = unsafe { instance_wrapper.instance.handle().clone() }; let mut preserved_mut_globals = vec![]; for global_idx in instance_wrapper.imported_globals_count..instance_wrapper.globals_count { let (def, global) = match handle.lookup_by_declaration( - &wasmtime_environ::Export::Global(GlobalIndex::from_u32(global_idx)), + &wasmtime_environ::EntityIndex::Global(GlobalIndex::from_u32(global_idx)), ) { - wasmtime_runtime::Export::Global { - definition, global, .. - } => (definition, global), + Export::Global(ExportGlobal { definition, global, .. }) => (definition, global), _ => unreachable!("only globals can be returned for a global request"), }; diff --git a/client/executor/wasmtime/src/runtime.rs b/client/executor/wasmtime/src/runtime.rs index 0289188ba1..a2ad3bada4 100644 --- a/client/executor/wasmtime/src/runtime.rs +++ b/client/executor/wasmtime/src/runtime.rs @@ -158,7 +158,7 @@ fn perform_call( Err(trap) => { return Err(Error::from(format!( "Wasm execution trapped: {}", - trap.message() + trap ))); } } -- GitLab From 3d669beaa1fca561243732ce7dee586a85229acc Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sat, 9 May 2020 13:44:40 +0200 Subject: [PATCH 002/150] Expose BlockHashCount on system metadata constants (#5960) --- frame/system/src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 8346b727b2..7219b0f518 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -481,6 +481,9 @@ decl_module! { pub struct Module for enum Call where origin: T::Origin { type Error = Error; + /// The maximum number of blocks to allow in mortal eras. + const BlockHashCount: T::BlockNumber = T::BlockHashCount::get(); + /// The maximum weight of a block. const MaximumBlockWeight: Weight = T::MaximumBlockWeight::get(); -- GitLab From d44702528ed61744143881cb290f8ae07c6701c2 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Sun, 10 May 2020 14:23:50 +0300 Subject: [PATCH 003/150] Add database type for import benchmarks (#5959) * add database type for impot benchmarks * add backend to name --- bin/node/bench/src/import.rs | 12 +++++-- bin/node/bench/src/main.rs | 19 +++++++--- bin/node/testing/src/bench.rs | 65 +++++++++++++++++++++++++++-------- 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/bin/node/bench/src/import.rs b/bin/node/bench/src/import.rs index 1fd2bbdecc..10f5ee8dca 100644 --- a/bin/node/bench/src/import.rs +++ b/bin/node/bench/src/import.rs @@ -30,7 +30,7 @@ use std::borrow::Cow; -use node_testing::bench::{BenchDb, Profile, BlockType, KeyTypes}; +use node_testing::bench::{BenchDb, Profile, BlockType, KeyTypes, DatabaseType}; use node_primitives::Block; use sc_client_api::backend::Backend; use sp_runtime::generic::BlockId; @@ -72,6 +72,7 @@ pub struct ImportBenchmarkDescription { pub key_types: KeyTypes, pub block_type: BlockType, pub size: SizeType, + pub database_type: DatabaseType, } pub struct ImportBenchmark { @@ -101,6 +102,11 @@ impl core::BenchmarkDescription for ImportBenchmarkDescription { BlockType::Noop(_) => path.push("noop"), } + match self.database_type { + DatabaseType::RocksDb => path.push("rocksdb"), + DatabaseType::ParityDb => path.push("paritydb"), + } + path.push(&format!("{}", self.size)); path @@ -109,6 +115,7 @@ impl core::BenchmarkDescription for ImportBenchmarkDescription { fn setup(self: Box) -> Box { let profile = self.profile; let mut bench_db = BenchDb::with_key_types( + self.database_type, 50_000, self.key_types ); @@ -122,9 +129,10 @@ impl core::BenchmarkDescription for ImportBenchmarkDescription { fn name(&self) -> Cow<'static, str> { format!( - "Import benchmark ({:?}, {:?})", + "Import benchmark ({:?}, {:?}, {:?} backend)", self.block_type, self.profile, + self.database_type, ).into() } } diff --git a/bin/node/bench/src/main.rs b/bin/node/bench/src/main.rs index e627f07c3d..df7e4c2da2 100644 --- a/bin/node/bench/src/main.rs +++ b/bin/node/bench/src/main.rs @@ -26,7 +26,7 @@ use crate::core::{run_benchmark, Mode as BenchmarkMode}; use crate::tempdb::DatabaseType; use import::{ImportBenchmarkDescription, SizeType}; use trie::{TrieReadBenchmarkDescription, TrieWriteBenchmarkDescription, DatabaseSize}; -use node_testing::bench::{Profile, KeyTypes, BlockType}; +use node_testing::bench::{Profile, KeyTypes, BlockType, DatabaseType as BenchDataBaseType}; use structopt::StructOpt; #[derive(Debug, StructOpt)] @@ -90,18 +90,21 @@ fn main() { BlockType::RandomTransfersReaping(txs), BlockType::Noop(txs), ].iter() { - import_benchmarks.push((profile.clone(), size.clone(), block_type.clone())); + for database_type in [BenchDataBaseType::RocksDb, BenchDataBaseType::ParityDb].iter() { + import_benchmarks.push((profile, size, block_type.clone(), database_type)); + } } } } let benchmarks = matrix!( - (profile, size, block_type) in import_benchmarks.iter() => + (profile, size, block_type, database_type) in import_benchmarks.into_iter() => ImportBenchmarkDescription { profile: *profile, key_types: KeyTypes::Sr25519, size: *size, - block_type: *block_type, + block_type: block_type, + database_type: *database_type, }, (size, db_type) in [ @@ -128,8 +131,14 @@ fn main() { ); if opt.list { + println!("Available benchmarks:"); + if let Some(filter) = opt.filter.as_ref() { + println!("\t(filtered by \"{}\")", filter); + } for benchmark in benchmarks.iter() { - log::info!("{}: {}", benchmark.name(), benchmark.path().full()) + if opt.filter.as_ref().map(|f| benchmark.path().has(f)).unwrap_or(true) { + println!("{}: {}", benchmark.name(), benchmark.path().full()) + } } return; } diff --git a/bin/node/testing/src/bench.rs b/bin/node/testing/src/bench.rs index cdc9cc86e5..b784d9f42b 100644 --- a/bin/node/testing/src/bench.rs +++ b/bin/node/testing/src/bench.rs @@ -20,7 +20,7 @@ //! can pregenerate seed database and `clone` it for every iteration of your benchmarks //! or tests to get consistent, smooth benchmark experience! -use std::{sync::Arc, path::Path, collections::BTreeMap}; +use std::{sync::Arc, path::{Path, PathBuf}, collections::BTreeMap}; use node_primitives::Block; use crate::client::{Client, Backend}; @@ -94,11 +94,13 @@ impl BenchPair { pub struct BenchDb { keyring: BenchKeyring, directory_guard: Guard, + database_type: DatabaseType, } impl Clone for BenchDb { fn clone(&self) -> Self { let keyring = self.keyring.clone(); + let database_type = self.database_type; let dir = tempfile::tempdir().expect("temp dir creation failed"); let seed_dir = self.directory_guard.0.path(); @@ -122,7 +124,7 @@ impl Clone for BenchDb { &fs_extra::dir::CopyOptions::new(), ).expect("Copy of seed database is ok"); - BenchDb { keyring, directory_guard: Guard(dir) } + BenchDb { keyring, directory_guard: Guard(dir), database_type } } } @@ -137,6 +139,29 @@ pub enum BlockType { Noop(usize), } +/// Type of backend database. +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum DatabaseType { + /// RocksDb backend. + RocksDb, + /// Parity DB backend. + ParityDb, +} + +impl DatabaseType { + fn into_settings(self, path: PathBuf) -> sc_client_db::DatabaseSettingsSrc { + match self { + Self::RocksDb => sc_client_db::DatabaseSettingsSrc::RocksDb { + path, + cache_size: 512, + }, + Self::ParityDb => sc_client_db::DatabaseSettingsSrc::ParityDb { + path, + } + } + } +} + impl BlockType { /// Number of transactions for this block type. pub fn transactions(&self) -> usize { @@ -181,7 +206,11 @@ impl BenchDb { /// /// See [`new`] method documentation for more information about the purpose /// of this structure. - pub fn with_key_types(keyring_length: usize, key_types: KeyTypes) -> Self { + pub fn with_key_types( + database_type: DatabaseType, + keyring_length: usize, + key_types: KeyTypes, + ) -> Self { let keyring = BenchKeyring::new(keyring_length, key_types); let dir = tempfile::tempdir().expect("temp dir creation failed"); @@ -190,10 +219,10 @@ impl BenchDb { "Created seed db at {}", dir.path().to_string_lossy(), ); - let (_client, _backend) = Self::bench_client(dir.path(), Profile::Native, &keyring); + let (_client, _backend) = Self::bench_client(database_type, dir.path(), Profile::Native, &keyring); let directory_guard = Guard(dir); - BenchDb { keyring, directory_guard } + BenchDb { keyring, directory_guard, database_type } } /// New immutable benchmarking database. @@ -204,8 +233,8 @@ impl BenchDb { /// You can `clone` this database or you can `create_context` from it /// (which also does `clone`) to run actual operation against new database /// which will be identical to the original. - pub fn new(keyring_length: usize) -> Self { - Self::with_key_types(keyring_length, KeyTypes::Sr25519) + pub fn new(database_type: DatabaseType, keyring_length: usize) -> Self { + Self::with_key_types(database_type, keyring_length, KeyTypes::Sr25519) } // This should return client that is doing everything that full node @@ -213,15 +242,17 @@ impl BenchDb { // // - This client should use best wasm execution method. // - This client should work with real database only. - fn bench_client(dir: &std::path::Path, profile: Profile, keyring: &BenchKeyring) -> (Client, std::sync::Arc) { + fn bench_client( + database_type: DatabaseType, + dir: &std::path::Path, + profile: Profile, + keyring: &BenchKeyring, + ) -> (Client, std::sync::Arc) { let db_config = sc_client_db::DatabaseSettings { state_cache_size: 16*1024*1024, state_cache_child_ratio: Some((0, 100)), pruning: PruningMode::ArchiveAll, - source: sc_client_db::DatabaseSettingsSrc::RocksDb { - path: dir.into(), - cache_size: 512, - }, + source: database_type.into_settings(dir.into()), }; let (client, backend) = sc_service::new_client( @@ -242,6 +273,7 @@ impl BenchDb { /// Generate new block using this database. pub fn generate_block(&mut self, block_type: BlockType) -> Block { let (client, _backend) = Self::bench_client( + self.database_type, self.directory_guard.path(), Profile::Wasm, &self.keyring, @@ -354,8 +386,13 @@ impl BenchDb { /// Clone this database and create context for testing/benchmarking. pub fn create_context(&self, profile: Profile) -> BenchContext { - let BenchDb { directory_guard, keyring } = self.clone(); - let (client, backend) = Self::bench_client(directory_guard.path(), profile, &keyring); + let BenchDb { directory_guard, keyring, database_type } = self.clone(); + let (client, backend) = Self::bench_client( + database_type, + directory_guard.path(), + profile, + &keyring + ); BenchContext { client, backend, db_guard: directory_guard, -- GitLab From 255c201e735aaac55452559cbf38678871c2b149 Mon Sep 17 00:00:00 2001 From: Alexander Popiak Date: Mon, 11 May 2020 10:20:46 +0200 Subject: [PATCH 004/150] weight adjustments for identity and timestamp pallets (#5946) --- bin/node/executor/tests/basic.rs | 8 +- frame/identity/src/lib.rs | 280 ++++++++++++++++--------------- frame/timestamp/src/lib.rs | 8 +- 3 files changed, 152 insertions(+), 144 deletions(-) diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index caf3b7c0c7..47d5f3f384 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -337,9 +337,9 @@ fn full_native_block_import_works() { let events = vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - // timestamp set call with weight 9_000_000 + 2 read + 1 write + // timestamp set call with weight 8_000_000 + 2 read + 1 write event: Event::frame_system(frame_system::RawEvent::ExtrinsicSuccess( - DispatchInfo { weight: 9_000_000 + 2 * 25_000_000 + 1 * 100_000_000, class: DispatchClass::Mandatory, ..Default::default() } + DispatchInfo { weight: 8_000_000 + 2 * 25_000_000 + 1 * 100_000_000, class: DispatchClass::Mandatory, ..Default::default() } )), topics: vec![], }, @@ -392,9 +392,9 @@ fn full_native_block_import_works() { let events = vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), - // timestamp set call with weight 9_000_000 + 2 read + 1 write + // timestamp set call with weight 8_000_000 + 2 read + 1 write event: Event::frame_system(frame_system::RawEvent::ExtrinsicSuccess( - DispatchInfo { weight: 9_000_000 + 2 * 25_000_000 + 1 * 100_000_000, class: DispatchClass::Mandatory, ..Default::default() } + DispatchInfo { weight: 8_000_000 + 2 * 25_000_000 + 1 * 100_000_000, class: DispatchClass::Mandatory, ..Default::default() } )), topics: vec![], }, diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 194a190ce6..c790203635 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -463,97 +463,126 @@ decl_error! { /// Functions for calcuating the weight of dispatchables. mod weight_for { - use frame_support::weights::{RuntimeDbWeight, Weight}; + use frame_support::{traits::Get, weights::Weight}; + use super::Trait; + + /// Weight calculation for `add_registrar`. + /// + /// Based on benchmark: + /// 22.24 + R * 0.371 µs (min squares analysis) + pub(crate) fn add_registrar( + registrars: Weight + ) -> Weight { + T::DbWeight::get().reads_writes(1, 1) + + 23_000_000 // constant + + 380_000 * registrars // R + } /// Weight calculation for `set_identity`. - pub(crate) fn set_identity( - db: RuntimeDbWeight, - judgements: impl Into, - extra_fields: impl Into + /// + /// Based on benchmark: + /// 50.64 + R * 0.215 + X * 1.424 µs (min squares analysis) + pub(crate) fn set_identity( + judgements: Weight, + extra_fields: Weight ) -> Weight { - db.reads_writes(1, 1) - + 61_000_000 // constant - + 400_000 * judgements.into() // R - + 1_500_000 * extra_fields.into() // X + T::DbWeight::get().reads_writes(1, 1) + + 51_000_000 // constant + + 220_000 * judgements // R + + 1_500_000 * extra_fields // X } /// Weight calculation for `set_subs`. - pub(crate) fn set_subs( - db: RuntimeDbWeight, - old_subs: impl Into + Copy, - subs: impl Into + Copy + /// + /// Based on benchmark: + /// 36.21 + P * 2.481 + S * 3.633 µs (min squares analysis) + pub(crate) fn set_subs( + old_subs: Weight, + subs: Weight ) -> Weight { + let db = T::DbWeight::get(); db.reads(1) // storage-exists (`IdentityOf::contains_key`) - + db.reads_writes(1, old_subs.into()) // `SubsOf::get` read + P old DB deletions - + db.writes(subs.into() + 1) // S + 1 new DB writes - + 41_000_000 // constant - + 2_600_000 * old_subs.into() // P - + 3_700_000 * subs.into() // S + .saturating_add(db.reads_writes(1, old_subs)) // `SubsOf::get` read + P old DB deletions + .saturating_add(db.writes(subs + 1)) // S + 1 new DB writes + .saturating_add(37_000_000) // constant + .saturating_add(2_500_000 * old_subs) // P + .saturating_add(subs.saturating_mul(3_700_000)) // S } /// Weight calculation for `clear_identity`. - pub(crate) fn clear_identity( - db: RuntimeDbWeight, - judgements: impl Into, - subs: impl Into + Copy, - extra_fields: impl Into + /// + /// Based on benchmark: + /// 43.19 + R * 0.099 + S * 2.547 + X * 0.875 µs (min squares analysis) + pub(crate) fn clear_identity( + judgements: Weight, + subs: Weight, + extra_fields: Weight ) -> Weight { - db.reads_writes(2, subs.into() + 2) // S + 2 deletions - + 58_000_000 // constant - + 20_000 * judgements.into() // R - + 2_600_000 * subs.into() // S - + 900_000 * extra_fields.into() // X + T::DbWeight::get().reads_writes(2, subs + 2) // S + 2 deletions + + 44_000_000 // constant + + 100_000 * judgements // R + + 2_600_000 * subs // S + + 900_000 * extra_fields // X } /// Weight calculation for `request_judgement`. - pub(crate) fn request_judgement( - db: RuntimeDbWeight, - judgements: impl Into, - extra_fields: impl Into + /// + /// Based on benchmark: + /// 51.51 + R * 0.32 + X * 1.85 µs (min squares analysis) + pub(crate) fn request_judgement( + judgements: Weight, + extra_fields: Weight ) -> Weight { - db.reads_writes(2, 1) - + 60_000_000 // constant - + 510_000 * judgements.into() // R - + 1_700_000 * extra_fields.into() // X + T::DbWeight::get().reads_writes(2, 1) + + 52_000_000 // constant + + 400_000 * judgements // R + + 1_900_000 * extra_fields // X } /// Weight calculation for `cancel_request`. - pub(crate) fn cancel_request( - db: RuntimeDbWeight, - judgements: impl Into, - extra_fields: impl Into + /// + /// Based on benchmark: + /// 40.95 + R * 0.219 + X * 1.655 µs (min squares analysis) + pub(crate) fn cancel_request( + judgements: Weight, + extra_fields: Weight ) -> Weight { - db.reads_writes(1, 1) - + 52_000_000 // constant - + 400_000 * judgements.into() // R - + 1_700_000 * extra_fields.into() // X + T::DbWeight::get().reads_writes(1, 1) + + 41_000_000 // constant + + 300_000 * judgements // R + + 1_700_000 * extra_fields // X } /// Weight calculation for `provide_judgement`. - pub(crate) fn provide_judgement( - db: RuntimeDbWeight, - judgements: impl Into, - extra_fields: impl Into + /// + /// Based on benchmark: + /// 40.77 + R * 0.282 + X * 1.66 µs (min squares analysis) + pub(crate) fn provide_judgement( + judgements: Weight, + extra_fields: Weight ) -> Weight { - db.reads_writes(2, 1) - + 49_000_000 // constant - + 400_000 * judgements.into() // R - + 1_700_000 * extra_fields.into()// X + T::DbWeight::get().reads_writes(2, 1) + + 41_000_000 // constant + + 300_000 * judgements // R + + 1_700_000 * extra_fields// X } /// Weight calculation for `kill_identity`. - pub(crate) fn kill_identity( - db: RuntimeDbWeight, - judgements: impl Into, - subs: impl Into + Copy, - extra_fields: impl Into + /// + /// Based on benchmark: + /// 83.96 + R * 0.122 + S * 2.533 + X * 0.867 µs (min squares analysis) + pub(crate) fn kill_identity( + judgements: Weight, + subs: Weight, + extra_fields: Weight ) -> Weight { - db.reads_writes(2, subs.into() + 2) // 2 `take`s + S deletions + let db = T::DbWeight::get(); + db.reads_writes(2, subs + 2) // 2 `take`s + S deletions + db.reads_writes(1, 1) // balance ops - + 110_000_000 // constant - + 100_000 * judgements.into() // R - + 2_600_000 * subs.into() // S - + 900_000 * extra_fields.into() // X + + 84_000_000 // constant + + 130_000 * judgements // R + + 2_600_000 * subs // S + + 900_000 * extra_fields // X } } @@ -598,27 +627,26 @@ decl_module! { /// - `O(R)` where `R` registrar-count (governance-bounded and code-bounded). /// - One storage mutation (codec `O(R)`). /// - One event. - /// - Benchmark: 24.63 + R * 0.53 µs (min squares analysis) /// # - #[weight = T::DbWeight::get().reads_writes(1, 1) - + 25_000_000 // constant - + 550_000 * T::MaxRegistrars::get() as Weight // R - ] + #[weight = weight_for::add_registrar::(T::MaxRegistrars::get().into()) ] fn add_registrar(origin, account: T::AccountId) -> DispatchResultWithPostInfo { T::RegistrarOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; - let (i, registrar_count) = >::try_mutate(|registrars| -> Result<(RegistrarIndex, usize), DispatchError> { - ensure!((registrars.len() as u32) < T::MaxRegistrars::get(), Error::::TooManyRegistrars); - registrars.push(Some(RegistrarInfo { account, fee: Zero::zero(), fields: Default::default() })); - Ok(((registrars.len() - 1) as RegistrarIndex, registrars.len())) - })?; + let (i, registrar_count) = >::try_mutate( + |registrars| -> Result<(RegistrarIndex, usize), DispatchError> { + ensure!(registrars.len() < T::MaxRegistrars::get() as usize, Error::::TooManyRegistrars); + registrars.push(Some(RegistrarInfo { + account, fee: Zero::zero(), fields: Default::default() + })); + Ok(((registrars.len() - 1) as RegistrarIndex, registrars.len())) + } + )?; Self::deposit_event(RawEvent::RegistrarAdded(i)); - Ok(Some(T::DbWeight::get().reads_writes(1, 1) - + 25_000_000 + 550_000 * registrar_count as Weight).into()) + Ok(Some(weight_for::add_registrar::(registrar_count as Weight)).into()) } /// Set an account's identity information and reserve the appropriate deposit. @@ -639,12 +667,10 @@ decl_module! { /// - One balance reserve operation. /// - One storage mutation (codec-read `O(X' + R)`, codec-write `O(X + R)`). /// - One event. - /// - Benchmark: 59.44 + R * 0.389 + X * 1.434 µs (min squares analysis) /// # - #[weight = weight_for::set_identity( - T::DbWeight::get(), - T::MaxRegistrars::get(), // R - T::MaxAdditionalFields::get() // X + #[weight = weight_for::set_identity::( + T::MaxRegistrars::get().into(), // R + T::MaxAdditionalFields::get().into(), // X )] fn set_identity(origin, info: IdentityInfo) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; @@ -675,8 +701,7 @@ decl_module! { >::insert(&sender, id); Self::deposit_event(RawEvent::IdentitySet(sender)); - Ok(Some(weight_for::set_identity( - T::DbWeight::get(), + Ok(Some(weight_for::set_identity::( judgements, // R extra_fields as Weight // X )).into()) @@ -702,11 +727,9 @@ decl_module! { /// - One storage read (codec complexity `O(P)`). /// - One storage write (codec complexity `O(S)`). /// - One storage-exists (`IdentityOf::contains_key`). - /// - Benchmark: 39.43 + P * 2.522 + S * 3.698 µs (min squares analysis) /// # - #[weight = weight_for::set_subs( - T::DbWeight::get(), - T::MaxSubAccounts::get(), // P + #[weight = weight_for::set_subs::( + T::MaxSubAccounts::get().into(), // P subs.len() as Weight // S )] fn set_subs(origin, subs: Vec<(T::AccountId, Data)>) -> DispatchResultWithPostInfo { @@ -740,8 +763,7 @@ decl_module! { >::insert(&sender, (new_deposit, ids)); } - Ok(Some(weight_for::set_subs( - T::DbWeight::get(), + Ok(Some(weight_for::set_subs::( old_ids.len() as Weight, // P new_subs // S )).into()) @@ -764,15 +786,11 @@ decl_module! { /// - One balance-unreserve operation. /// - `2` storage reads and `S + 2` storage deletions. /// - One event. - /// - Benchmarks: - /// - 57.36 + R * 0.019 + S * 2.577 + X * 0.874 µs (median slopes analysis) - /// - 57.06 + R * 0.006 + S * 2.579 + X * 0.878 µs (min squares analysis) /// # - #[weight = weight_for::clear_identity( - T::DbWeight::get(), - T::MaxRegistrars::get(), // R - T::MaxSubAccounts::get(), // S - T::MaxAdditionalFields::get() // X + #[weight = weight_for::clear_identity::( + T::MaxRegistrars::get().into(), // R + T::MaxSubAccounts::get().into(), // S + T::MaxAdditionalFields::get().into(), // X )] fn clear_identity(origin) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; @@ -789,8 +807,7 @@ decl_module! { Self::deposit_event(RawEvent::IdentityCleared(sender, deposit)); - Ok(Some(weight_for::clear_identity( - T::DbWeight::get(), + Ok(Some(weight_for::clear_identity::( id.judgements.len() as Weight, // R sub_ids.len() as Weight, // S id.info.additional.len() as Weight // X @@ -819,12 +836,10 @@ decl_module! { /// - One balance-reserve operation. /// - Storage: 1 read `O(R)`, 1 mutate `O(X + R)`. /// - One event. - /// - Benchmark: 59.02 + R * 0.488 + X * 1.7 µs (min squares analysis) /// # - #[weight = weight_for::request_judgement( - T::DbWeight::get(), - T::MaxRegistrars::get(), // R - T::MaxAdditionalFields::get() // X + #[weight = weight_for::request_judgement::( + T::MaxRegistrars::get().into(), // R + T::MaxAdditionalFields::get().into(), // X )] fn request_judgement(origin, #[compact] reg_index: RegistrarIndex, @@ -855,7 +870,7 @@ decl_module! { Self::deposit_event(RawEvent::JudgementRequested(sender, reg_index)); - Ok(Some(weight_for::request_judgement(T::DbWeight::get(), judgements, extra_fields)).into()) + Ok(Some(weight_for::request_judgement::(judgements, extra_fields)).into()) } /// Cancel a previous request. @@ -873,13 +888,11 @@ decl_module! { /// - `O(R + X)`. /// - One balance-reserve operation. /// - One storage mutation `O(R + X)`. - /// - One event. - /// - Benchmark: 50.05 + R * 0.321 + X * 1.688 µs (min squares analysis) + /// - One event /// # - #[weight = weight_for::cancel_request( - T::DbWeight::get(), - T::MaxRegistrars::get(), // R - T::MaxAdditionalFields::get() // X + #[weight = weight_for::cancel_request::( + T::MaxRegistrars::get().into(), // R + T::MaxAdditionalFields::get().into(), // X )] fn cancel_request(origin, reg_index: RegistrarIndex) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; @@ -900,7 +913,7 @@ decl_module! { Self::deposit_event(RawEvent::JudgementUnrequested(sender, reg_index)); - Ok(Some(weight_for::request_judgement(T::DbWeight::get(), judgements, extra_fields)).into()) + Ok(Some(weight_for::request_judgement::(judgements, extra_fields)).into()) } /// Set the fee required for a judgement to be requested from a registrar. @@ -914,11 +927,11 @@ decl_module! { /// # /// - `O(R)`. /// - One storage mutation `O(R)`. - /// - Benchmark: 8.848 + R * 0.425 µs (min squares analysis) + /// - Benchmark: 7.315 + R * 0.329 µs (min squares analysis) /// # #[weight = T::DbWeight::get().reads_writes(1, 1) - + 9_000_000 // constant - + 430_000 * T::MaxRegistrars::get() as Weight // R + + 7_400_000 // constant + + 330_000 * T::MaxRegistrars::get() as Weight // R ] fn set_fee(origin, #[compact] index: RegistrarIndex, @@ -934,7 +947,7 @@ decl_module! { Ok(rs.len()) })?; Ok(Some(T::DbWeight::get().reads_writes(1, 1) - + 9_000_000 + 430_000 * registrars as Weight // R + + 7_400_000 + 330_000 * registrars as Weight // R ).into()) } @@ -949,11 +962,11 @@ decl_module! { /// # /// - `O(R)`. /// - One storage mutation `O(R)`. - /// - Benchmark: 10.05 + R * 0.438 µs (min squares analysis) + /// - Benchmark: 8.823 + R * 0.32 µs (min squares analysis) /// # #[weight = T::DbWeight::get().reads_writes(1, 1) - + 10_100_000 // constant - + 440_000 * T::MaxRegistrars::get() as Weight // R + + 8_900_000 // constant + + 320_000 * T::MaxRegistrars::get() as Weight // R ] fn set_account_id(origin, #[compact] index: RegistrarIndex, @@ -969,7 +982,7 @@ decl_module! { Ok(rs.len()) })?; Ok(Some(T::DbWeight::get().reads_writes(1, 1) - + 10_100_000 + 440_000 * registrars as Weight // R + + 8_900_000 + 320_000 * registrars as Weight // R ).into()) } @@ -984,11 +997,11 @@ decl_module! { /// # /// - `O(R)`. /// - One storage mutation `O(R)`. - /// - Benchmark: 8.985 + R * 0.413 µs (min squares analysis) + /// - Benchmark: 7.464 + R * 0.325 µs (min squares analysis) /// # #[weight = T::DbWeight::get().reads_writes(1, 1) - + 9_000_000 // constant - + 420_000 * T::MaxRegistrars::get() as Weight // R + + 7_500_000 // constant + + 330_000 * T::MaxRegistrars::get() as Weight // R ] fn set_fields(origin, #[compact] index: RegistrarIndex, @@ -1004,7 +1017,7 @@ decl_module! { Ok(rs.len()) })?; Ok(Some(T::DbWeight::get().reads_writes(1, 1) - + 9_000_000 + 420_000 * registrars as Weight // R + + 7_500_000 + 330_000 * registrars as Weight // R ).into()) } @@ -1026,12 +1039,10 @@ decl_module! { /// - Up to one account-lookup operation. /// - Storage: 1 read `O(R)`, 1 mutate `O(R + X)`. /// - One event. - /// - Benchmark: 47.77 + R * 0.336 + X * 1.664 µs (min squares analysis) /// # - #[weight = weight_for::provide_judgement( - T::DbWeight::get(), - T::MaxRegistrars::get(), // R - T::MaxAdditionalFields::get() // X + #[weight = weight_for::provide_judgement::( + T::MaxRegistrars::get().into(), // R + T::MaxAdditionalFields::get().into(), // X )] fn provide_judgement(origin, #[compact] reg_index: RegistrarIndex, @@ -1064,7 +1075,7 @@ decl_module! { >::insert(&target, id); Self::deposit_event(RawEvent::JudgementGiven(target, reg_index)); - Ok(Some(weight_for::provide_judgement(T::DbWeight::get(), judgements, extra_fields)).into()) + Ok(Some(weight_for::provide_judgement::(judgements, extra_fields)).into()) } /// Remove an account's identity and sub-account information and slash the deposits. @@ -1085,13 +1096,11 @@ decl_module! { /// - One balance-reserve operation. /// - `S + 2` storage mutations. /// - One event. - /// - Benchmark: 101.9 + R * 0.091 + S * 2.589 + X * 0.871 µs (min squares analysis) /// # - #[weight = weight_for::kill_identity( - T::DbWeight::get(), - T::MaxRegistrars::get(), // R - T::MaxSubAccounts::get(), // S - T::MaxAdditionalFields::get() // X + #[weight = weight_for::kill_identity::( + T::MaxRegistrars::get().into(), // R + T::MaxSubAccounts::get().into(), // S + T::MaxAdditionalFields::get().into(), // X )] fn kill_identity(origin, target: ::Source) -> DispatchResultWithPostInfo { T::ForceOrigin::try_origin(origin) @@ -1112,8 +1121,7 @@ decl_module! { Self::deposit_event(RawEvent::IdentityKilled(target, deposit)); - Ok(Some(weight_for::kill_identity( - T::DbWeight::get(), + Ok(Some(weight_for::kill_identity::( id.judgements.len() as Weight, // R sub_ids.len() as Weight, // S id.info.additional.len() as Weight // X diff --git a/frame/timestamp/src/lib.rs b/frame/timestamp/src/lib.rs index 31021e0887..cb27fc711f 100644 --- a/frame/timestamp/src/lib.rs +++ b/frame/timestamp/src/lib.rs @@ -152,12 +152,12 @@ decl_module! { /// - `O(T)` where `T` complexity of `on_timestamp_set` /// - 1 storage read and 1 storage mutation (codec `O(1)`). (because of `DidUpdate::take` in `on_finalize`) /// - 1 event handler `on_timestamp_set` `O(T)`. - /// - Benchmark: 8.523 (min squares analysis) + /// - Benchmark: 7.678 (min squares analysis) /// - NOTE: This benchmark was done for a runtime with insignificant `on_timestamp_set` handlers. /// New benchmarking is needed when adding new handlers. /// # #[weight = ( - T::DbWeight::get().reads_writes(2, 1) + 9_000_000, + T::DbWeight::get().reads_writes(2, 1) + 8_000_000, DispatchClass::Mandatory )] fn set(origin, #[compact] now: T::Moment) { @@ -177,13 +177,13 @@ decl_module! { /// dummy `on_initialize` to return the weight used in `on_finalize`. fn on_initialize() -> Weight { // weight of `on_finalize` - 6_000_000 + 5_000_000 } /// # /// - `O(1)` /// - 1 storage deletion (codec `O(1)`). - /// - Benchmark: 5.105 µs (min squares analysis) + /// - Benchmark: 4.928 µs (min squares analysis) /// # fn on_finalize() { assert!(::DidUpdate::take(), "Timestamp must be updated once in the block"); -- GitLab From 2e21842c074074948c7a0e1353b69c80301d2338 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 11 May 2020 11:36:00 +0300 Subject: [PATCH 005/150] Refactor network transactions handling (#5939) * change propagation * add bound --- client/network/src/config.rs | 36 ++++++++++------ client/network/src/protocol.rs | 76 ++++++++++++++++++++++++++++------ client/service/src/builder.rs | 1 - client/service/src/lib.rs | 68 +++++++++++++++--------------- 4 files changed, 122 insertions(+), 59 deletions(-) diff --git a/client/network/src/config.rs b/client/network/src/config.rs index 66800aeeaf..9a979ac16d 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -28,14 +28,14 @@ pub use libp2p::{identity, core::PublicKey, wasm_ext::ExtTransport, build_multia #[doc(hidden)] pub use crate::protocol::ProtocolConfig; -use crate::{ExHashT, ReportHandle}; +use crate::ExHashT; use core::{fmt, iter}; +use futures::future; use libp2p::identity::{ed25519, Keypair}; use libp2p::wasm_ext; use libp2p::{multiaddr, Multiaddr, PeerId}; use prometheus_endpoint::Registry; -use sc_peerset::ReputationChange; use sp_consensus::{block_validation::BlockAnnounceValidator, import_queue::ImportQueue}; use sp_runtime::{traits::Block as BlockT, ConsensusEngineId}; use std::{borrow::Cow, convert::TryFrom, future::Future, pin::Pin, str::FromStr}; @@ -167,6 +167,22 @@ impl FinalityProofRequestBuilder for DummyFinalityProofRequestBuil /// Shared finality proof request builder struct used by the queue. pub type BoxFinalityProofRequestBuilder = Box + Send + Sync>; +/// Result of the transaction import. +#[derive(Clone, Copy, Debug)] +pub enum TransactionImport { + /// Transaction is good but already known by the transaction pool. + KnownGood, + /// Transaction is good and not yet known. + NewGood, + /// Transaction is invalid. + Bad, + /// Transaction import was not performed. + None, +} + +/// Fuure resolving to transaction import result. +pub type TransactionImportFuture = Pin + Send>>; + /// Transaction pool interface pub trait TransactionPool: Send + Sync { /// Get transactions from the pool that are ready to be propagated. @@ -175,15 +191,11 @@ pub trait TransactionPool: Send + Sync { fn hash_of(&self, transaction: &B::Extrinsic) -> H; /// Import a transaction into the pool. /// - /// Peer reputation is changed by reputation_change if transaction is accepted by the pool. + /// This will return future. fn import( &self, - report_handle: ReportHandle, - who: PeerId, - reputation_change_good: ReputationChange, - reputation_change_bad: ReputationChange, transaction: B::Extrinsic, - ); + ) -> TransactionImportFuture; /// Notify the pool about transactions broadcast. fn on_broadcasted(&self, propagations: HashMap>); /// Get transaction by hash. @@ -209,12 +221,10 @@ impl TransactionPool for EmptyTransaction fn import( &self, - _report_handle: ReportHandle, - _who: PeerId, - _rep_change_good: ReputationChange, - _rep_change_bad: ReputationChange, _transaction: B::Extrinsic - ) {} + ) -> TransactionImportFuture { + Box::pin(future::ready(TransactionImport::KnownGood)) + } fn on_broadcasted(&self, _: HashMap>) {} diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 895624f08d..56383604f8 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -17,13 +17,13 @@ use crate::{ ExHashT, chain::{Client, FinalityProofProvider}, - config::{BoxFinalityProofRequestBuilder, ProtocolId, TransactionPool}, + config::{BoxFinalityProofRequestBuilder, ProtocolId, TransactionPool, TransactionImportFuture, TransactionImport}, error, utils::interval }; use bytes::{Bytes, BytesMut}; -use futures::prelude::*; +use futures::{prelude::*, stream::FuturesUnordered}; use generic_proto::{GenericProto, GenericProtoOut}; use libp2p::{Multiaddr, PeerId}; use libp2p::core::{ConnectedPoint, connection::{ConnectionId, ListenerId}}; @@ -78,6 +78,9 @@ const MAX_KNOWN_BLOCKS: usize = 1024; // ~32kb per peer + LruHashSet overhead /// Maximim number of known extrinsic hashes to keep for a peer. const MAX_KNOWN_EXTRINSICS: usize = 4096; // ~128kb per peer + overhead +/// Maximim number of transaction validation request we keep at any moment. +const MAX_PENDING_TRANSACTIONS: usize = 8192; + /// Current protocol version. pub(crate) const CURRENT_VERSION: u32 = 6; /// Lowest version we support @@ -101,6 +104,13 @@ mod rep { pub const UNEXPECTED_STATUS: Rep = Rep::new(-(1 << 20), "Unexpected status message"); /// Reputation change when we are a light client and a peer is behind us. pub const PEER_BEHIND_US_LIGHT: Rep = Rep::new(-(1 << 8), "Useless for a light peer"); + /// Reputation change when a peer sends us any extrinsic. + /// + /// This forces node to verify it, thus the negative value here. Once extrinsic is verified, + /// reputation change should be refunded with `ANY_EXTRINSIC_REFUND` + pub const ANY_EXTRINSIC: Rep = Rep::new(-(1 << 4), "Any extrinsic"); + /// Reputation change when a peer sends us any extrinsic that is not invalid. + pub const ANY_EXTRINSIC_REFUND: Rep = Rep::new(1 << 4, "Any extrinsic (refund)"); /// Reputation change when a peer sends us an extrinsic that we didn't know about. pub const GOOD_EXTRINSIC: Rep = Rep::new(1 << 7, "Good extrinsic"); /// Reputation change when a peer sends us a bad extrinsic. @@ -182,6 +192,24 @@ impl Metrics { } } +struct PendingTransaction { + validation: TransactionImportFuture, + peer_id: PeerId, +} + +impl Future for PendingTransaction { + type Output = (PeerId, TransactionImport); + + fn poll(self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll { + let this = Pin::into_inner(self); + if let Poll::Ready(import_result) = this.validation.poll_unpin(cx) { + return Poll::Ready((this.peer_id.clone(), import_result)); + } + + Poll::Pending + } +} + // Lock must always be taken in order declared here. pub struct Protocol { /// Interval at which we call `tick`. @@ -190,6 +218,8 @@ pub struct Protocol { propagate_timeout: Pin + Send>>, /// Pending list of messages to return from `poll` as a priority. pending_messages: VecDeque>, + /// Pending extrinsic verification tasks. + pending_transactions: FuturesUnordered, config: ProtocolConfig, genesis_hash: B::Hash, sync: ChainSync, @@ -394,6 +424,7 @@ impl Protocol { tick_timeout: Box::pin(interval(TICK_TIMEOUT)), propagate_timeout: Box::pin(interval(PROPAGATE_TIMEOUT)), pending_messages: VecDeque::new(), + pending_transactions: FuturesUnordered::new(), config, context_data: ContextData { peers: HashMap::new(), @@ -1118,20 +1149,37 @@ impl Protocol { trace!(target: "sync", "Received {} extrinsics from {}", extrinsics.len(), who); if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { for t in extrinsics { + if self.pending_transactions.len() > MAX_PENDING_TRANSACTIONS { + debug!( + target: "sync", + "Ignoring any further transactions that exceed `MAX_PENDING_TRANSACTIONS`({}) limit", + MAX_PENDING_TRANSACTIONS, + ); + break; + } + let hash = self.transaction_pool.hash_of(&t); peer.known_extrinsics.insert(hash); - self.transaction_pool.import( - self.peerset_handle.clone().into(), - who.clone(), - rep::GOOD_EXTRINSIC, - rep::BAD_EXTRINSIC, - t, - ); + self.peerset_handle.report_peer(who.clone(), rep::ANY_EXTRINSIC); + + self.pending_transactions.push(PendingTransaction { + peer_id: who.clone(), + validation: self.transaction_pool.import(t), + }); } } } + fn on_handle_extrinsic_import(&mut self, who: PeerId, import: TransactionImport) { + match import { + TransactionImport::KnownGood => self.peerset_handle.report_peer(who, rep::ANY_EXTRINSIC_REFUND), + TransactionImport::NewGood => self.peerset_handle.report_peer(who, rep::GOOD_EXTRINSIC), + TransactionImport::Bad => self.peerset_handle.report_peer(who, rep::BAD_EXTRINSIC), + TransactionImport::None => {}, + } + } + /// Propagate one extrinsic. pub fn propagate_extrinsic( &mut self, @@ -1953,7 +2001,7 @@ impl NetworkBehaviour for Protocol { &mut self.context_data.stats, &mut self.context_data.peers, &id, - GenericMessage::BlockRequest(r) + GenericMessage::BlockRequest(r), ) } } @@ -1970,7 +2018,7 @@ impl NetworkBehaviour for Protocol { &mut self.context_data.stats, &mut self.context_data.peers, &id, - GenericMessage::BlockRequest(r) + GenericMessage::BlockRequest(r), ) } } @@ -1988,9 +2036,13 @@ impl NetworkBehaviour for Protocol { &mut self.context_data.stats, &mut self.context_data.peers, &id, - GenericMessage::FinalityProofRequest(r)) + GenericMessage::FinalityProofRequest(r), + ) } } + if let Poll::Ready(Some((peer_id, result))) = self.pending_transactions.poll_next_unpin(cx) { + self.on_handle_extrinsic_import(peer_id, result); + } if let Some(message) = self.pending_messages.pop_front() { return Poll::Ready(NetworkBehaviourAction::GenerateEvent(message)); } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 68abf8e3cd..eb6e040cc4 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -883,7 +883,6 @@ ServiceBuilder< imports_external_transactions: !matches!(config.role, Role::Light), pool: transaction_pool.clone(), client: client.clone(), - executor: task_manager.spawn_handle(), }); let protocol_id = { diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 1c0f8ced74..ad42a2b39f 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -50,7 +50,7 @@ use futures::{ sink::SinkExt, task::{Spawn, FutureObj, SpawnError}, }; -use sc_network::{NetworkService, network_state::NetworkState, PeerId, ReportHandle}; +use sc_network::{NetworkService, network_state::NetworkState, PeerId}; use log::{log, warn, debug, error, Level}; use codec::{Encode, Decode}; use sp_runtime::generic::BlockId; @@ -76,7 +76,10 @@ pub use sc_executor::NativeExecutionDispatch; #[doc(hidden)] pub use std::{ops::Deref, result::Result, sync::Arc}; #[doc(hidden)] -pub use sc_network::config::{FinalityProofProvider, OnDemand, BoxFinalityProofRequestBuilder}; +pub use sc_network::config::{ + FinalityProofProvider, OnDemand, BoxFinalityProofRequestBuilder, TransactionImport, + TransactionImportFuture, +}; pub use sc_tracing::TracingReceiver; pub use task_manager::SpawnTaskHandle; use task_manager::TaskManager; @@ -616,7 +619,6 @@ pub struct TransactionPoolAdapter { imports_external_transactions: bool, pool: Arc

, client: Arc, - executor: SpawnTaskHandle, } /// Get transactions for propagation. @@ -659,42 +661,42 @@ where fn import( &self, - report_handle: ReportHandle, - who: PeerId, - reputation_change_good: sc_network::ReputationChange, - reputation_change_bad: sc_network::ReputationChange, - transaction: B::Extrinsic - ) { + transaction: B::Extrinsic, + ) -> TransactionImportFuture { if !self.imports_external_transactions { debug!("Transaction rejected"); - return; + Box::pin(futures::future::ready(TransactionImport::None)); } let encoded = transaction.encode(); - match Decode::decode(&mut &encoded[..]) { - Ok(uxt) => { - let best_block_id = BlockId::hash(self.client.info().best_hash); - let source = sp_transaction_pool::TransactionSource::External; - let import_future = self.pool.submit_one(&best_block_id, source, uxt); - let import_future = import_future - .map(move |import_result| { - match import_result { - Ok(_) => report_handle.report_peer(who, reputation_change_good), - Err(e) => match e.into_pool_error() { - Ok(sp_transaction_pool::error::Error::AlreadyImported(_)) => (), - Ok(e) => { - report_handle.report_peer(who, reputation_change_bad); - debug!("Error adding transaction to the pool: {:?}", e) - } - Err(e) => debug!("Error converting pool error: {:?}", e), - } - } - }); - - self.executor.spawn("extrinsic-import", import_future); + let uxt = match Decode::decode(&mut &encoded[..]) { + Ok(uxt) => uxt, + Err(e) => { + debug!("Transaction invalid: {:?}", e); + return Box::pin(futures::future::ready(TransactionImport::Bad)); } - Err(e) => debug!("Error decoding transaction {}", e), - } + }; + + let best_block_id = BlockId::hash(self.client.info().best_hash); + + let import_future = self.pool.submit_one(&best_block_id, sp_transaction_pool::TransactionSource::External, uxt); + Box::pin(async move { + match import_future.await { + Ok(_) => TransactionImport::NewGood, + Err(e) => match e.into_pool_error() { + Ok(sp_transaction_pool::error::Error::AlreadyImported(_)) => TransactionImport::KnownGood, + Ok(e) => { + debug!("Error adding transaction to the pool: {:?}", e); + TransactionImport::Bad + } + Err(e) => { + debug!("Error converting pool error: {:?}", e); + // it is not bad at least, just some internal node logic error, so peer is innocent. + TransactionImport::KnownGood + } + } + } + }) } fn on_broadcasted(&self, propagations: HashMap>) { -- GitLab From e05907563fced13399c82839ead5d2cb87ee05a6 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Mon, 11 May 2020 10:41:33 +0200 Subject: [PATCH 006/150] Fix very wrong staking test (#5952) * fix this damn wrong staking test. * Update frame/staking/src/tests.rs * assert on balnce as well * Make it a bit better. --- frame/staking/src/mock.rs | 6 ++- frame/staking/src/tests.rs | 102 ++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 47 deletions(-) diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 21400b0b8d..b09d026eb3 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -473,7 +473,7 @@ impl ExtBuilder { (41, balance_factor * 2000), (100, 2000 * balance_factor), (101, 2000 * balance_factor), - // This allow us to have a total_payout different from 0. + // This allows us to have a total_payout different from 0. (999, 1_000_000_000_000), ], }.assimilate_storage(&mut storage); @@ -1035,3 +1035,7 @@ pub(crate) fn staking_events() -> Vec> { } }).collect() } + +pub(crate) fn balances(who: &AccountId) -> (Balance, Balance) { + (Balances::free_balance(who), Balances::reserved_balance(who)) +} diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 73fcb6c2af..9cda151b70 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -28,11 +28,9 @@ use frame_support::{ }; use pallet_balances::Error as BalancesError; use substrate_test_utils::assert_eq_uvec; -use crate::Store; #[test] fn force_unstake_works() { - // Verifies initial conditions of mock ExtBuilder::default().build_and_execute(|| { // Account 11 is stashed and locked, and account 10 is the controller assert_eq!(Staking::bonded(&11), Some(10)); @@ -128,17 +126,18 @@ fn basic_setup_works() { #[test] fn change_controller_works() { ExtBuilder::default().build_and_execute(|| { + // 10 and 11 are bonded as stash controller. assert_eq!(Staking::bonded(&11), Some(10)); - assert!(Session::validators().contains(&11)); // 10 can control 11 who is initially a validator. assert_ok!(Staking::chill(Origin::signed(10))); - assert!(Session::validators().contains(&11)); + // change controller assert_ok!(Staking::set_controller(Origin::signed(11), 5)); - + assert_eq!(Staking::bonded(&11), Some(5)); mock::start_era(1); + // 10 is no longer in control. assert_noop!( Staking::validate(Origin::signed(10), ValidatorPrefs::default()), Error::::NotController, @@ -533,60 +532,71 @@ fn nominating_and_rewards_should_work() { } #[test] -fn nominators_also_get_slashed() { - // A nominator should be slashed if the validator they nominated is slashed - // Here is the breakdown of roles: - // 10 - is the controller of 11 - // 11 - is the stash. - // 2 - is the nominator of 20, 10 - ExtBuilder::default().nominate(false).build_and_execute(|| { - assert_eq!(Staking::validator_count(), 2); - - // Set payee to controller - assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); - - // give the man some money. - let initial_balance = 1000; - for i in [1, 2, 3, 10].iter() { - let _ = Balances::make_free_balance_be(i, initial_balance); - } - - // 2 will nominate for 10, 20 - let nominator_stake = 500; - assert_ok!(Staking::bond(Origin::signed(1), 2, nominator_stake, RewardDestination::default())); - assert_ok!(Staking::nominate(Origin::signed(2), vec![20, 10])); - - let total_payout = current_total_payout_for_duration(3000); - assert!(total_payout > 100); // Test is meaningful if reward something - >::reward_by_ids(vec![(11, 1)]); - - // new era, pay rewards, +fn nominators_also_get_slashed_pro_rata() { + ExtBuilder::default().build_and_execute(|| { mock::start_era(1); + let slash_percent = Perbill::from_percent(5); + let initial_exposure = Staking::eras_stakers(active_era(), 11); + // 101 is a nominator for 11 + assert_eq!( + initial_exposure.others.first().unwrap().who, + 101, + ); - // Nominator stash didn't collect any. - assert_eq!(Balances::total_balance(&2), initial_balance); + // staked values; + let nominator_stake = Staking::ledger(100).unwrap().active; + let nominator_balance = balances(&101).0; + let validator_stake = Staking::ledger(10).unwrap().active; + let validator_balance = balances(&11).0; + let exposed_stake = initial_exposure.total; + let exposed_validator = initial_exposure.own; + let exposed_nominator = initial_exposure.others.first().unwrap().value; - // 10 goes offline + // 11 goes offline on_offence_now( &[OffenceDetails { offender: ( 11, - Staking::eras_stakers(Staking::active_era().unwrap().index, 11), + initial_exposure.clone(), ), reporters: vec![], }], - &[Perbill::from_percent(5)], + &[slash_percent], ); - let expo = Staking::eras_stakers(Staking::active_era().unwrap().index, 11); - let slash_value = 50; - let total_slash = expo.total.min(slash_value); - let validator_slash = expo.own.min(total_slash); - let nominator_slash = nominator_stake.min(total_slash - validator_slash); - // initial + first era reward + slash - assert_eq!(Balances::total_balance(&11), initial_balance - validator_slash); - assert_eq!(Balances::total_balance(&2), initial_balance - nominator_slash); + // both stakes must have been decreased. + assert!(Staking::ledger(100).unwrap().active < nominator_stake); + assert!(Staking::ledger(10).unwrap().active < validator_stake); + let slash_amount = slash_percent * exposed_stake; + let validator_share = + Perbill::from_rational_approximation(exposed_validator, exposed_stake) * slash_amount; + let nominator_share = Perbill::from_rational_approximation( + exposed_nominator, + exposed_stake, + ) * slash_amount; + + // both slash amounts need to be positive for the test to make sense. + assert!(validator_share > 0); + assert!(nominator_share > 0); + + // both stakes must have been decreased pro-rata. + assert_eq!( + Staking::ledger(100).unwrap().active, + nominator_stake - nominator_share, + ); + assert_eq!( + Staking::ledger(10).unwrap().active, + validator_stake - validator_share, + ); + assert_eq!( + balances(&101).0, // free balance + nominator_balance - nominator_share, + ); + assert_eq!( + balances(&11).0, // free balance + validator_balance - validator_share, + ); // Because slashing happened. assert!(is_disabled(10)); }); -- GitLab From 6ecbc4c45b913360878afd831bef05dddecef444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Mon, 11 May 2020 10:48:34 +0200 Subject: [PATCH 007/150] Don't repeatedly lookup keys in `babe_epochAuthorship` rpc function (#5962) * babe: don't repeatedly lookup keys in authorship rpc function Expose a new function `claim_slot_using_keypars` in Babe so that the `babe_epochAuthorship` can lookup authorship for all slots in the epoch without repeatedly looking up keys in the keystore. Time to run the `babe_epochAuthorship` RPC call goes from 7s to 25ms on a local dev chain on my machine. * babe: pass reference to slice instead of ref to Vec * babe: fix bunch of clippy warnings --- client/consensus/babe/rpc/src/lib.rs | 15 ++++++- client/consensus/babe/src/authorship.rs | 58 ++++++++++++++----------- client/consensus/babe/src/aux_schema.rs | 2 +- client/consensus/babe/src/lib.rs | 19 ++++---- 4 files changed, 55 insertions(+), 39 deletions(-) diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index fa5421761c..aa7e1c0e1e 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -116,9 +116,20 @@ impl BabeApi for BabeRPCHandler let mut claims: HashMap = HashMap::new(); + let key_pairs = { + let keystore = keystore.read(); + epoch.authorities.iter().enumerate() + .flat_map(|(i, a)| { + keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) + }) + .collect::>() + }; + for slot_number in epoch_start..epoch_end { let epoch = epoch_data(&shared_epoch, &client, &babe_config, slot_number, &select_chain)?; - if let Some((claim, key)) = authorship::claim_slot(slot_number, &epoch, &keystore) { + if let Some((claim, key)) = + authorship::claim_slot_using_key_pairs(slot_number, &epoch, &key_pairs) + { match claim { PreDigest::Primary { .. } => { claims.entry(key.public()).or_default().primary.push(slot_number); @@ -163,7 +174,7 @@ pub enum Error { impl From for jsonrpc_core::Error { fn from(error: Error) -> Self { jsonrpc_core::Error { - message: format!("{}", error).into(), + message: format!("{}", error), code: jsonrpc_core::ErrorCode::ServerError(1234), data: None, } diff --git a/client/consensus/babe/src/authorship.rs b/client/consensus/babe/src/authorship.rs index 1810f9f5be..584501110b 100644 --- a/client/consensus/babe/src/authorship.rs +++ b/client/consensus/babe/src/authorship.rs @@ -124,7 +124,7 @@ pub(super) fn secondary_slot_author( fn claim_secondary_slot( slot_number: SlotNumber, epoch: &Epoch, - keystore: &KeyStorePtr, + key_pairs: &[(AuthorityPair, usize)], author_secondary_vrf: bool, ) -> Option<(PreDigest, AuthorityPair)> { let Epoch { authorities, randomness, epoch_index, .. } = epoch; @@ -139,14 +139,7 @@ fn claim_secondary_slot( *randomness, )?; - let keystore = keystore.read(); - - for (pair, authority_index) in authorities.iter() - .enumerate() - .flat_map(|(i, a)| { - keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) - }) - { + for (pair, authority_index) in key_pairs { if pair.public() == *expected_author { let pre_digest = if author_secondary_vrf { let transcript = super::authorship::make_transcript( @@ -161,16 +154,16 @@ fn claim_secondary_slot( slot_number, vrf_output: VRFOutput(s.0.to_output()), vrf_proof: VRFProof(s.1), - authority_index: authority_index as u32, + authority_index: *authority_index as u32, }) } else { PreDigest::SecondaryPlain(SecondaryPlainPreDigest { slot_number, - authority_index: authority_index as u32, + authority_index: *authority_index as u32, }) }; - return Some((pre_digest, pair)); + return Some((pre_digest, pair.clone())); } } @@ -186,7 +179,26 @@ pub fn claim_slot( epoch: &Epoch, keystore: &KeyStorePtr, ) -> Option<(PreDigest, AuthorityPair)> { - claim_primary_slot(slot_number, epoch, epoch.config.c, keystore) + let key_pairs = { + let keystore = keystore.read(); + epoch.authorities.iter() + .enumerate() + .flat_map(|(i, a)| { + keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) + }) + .collect::>() + }; + claim_slot_using_key_pairs(slot_number, epoch, &key_pairs) +} + +/// Like `claim_slot`, but allows passing an explicit set of key pairs. Useful if we intend +/// to make repeated calls for different slots using the same key pairs. +pub fn claim_slot_using_key_pairs( + slot_number: SlotNumber, + epoch: &Epoch, + key_pairs: &[(AuthorityPair, usize)], +) -> Option<(PreDigest, AuthorityPair)> { + claim_primary_slot(slot_number, epoch, epoch.config.c, &key_pairs) .or_else(|| { if epoch.config.allowed_slots.is_secondary_plain_slots_allowed() || epoch.config.allowed_slots.is_secondary_vrf_slots_allowed() @@ -194,7 +206,7 @@ pub fn claim_slot( claim_secondary_slot( slot_number, &epoch, - keystore, + &key_pairs, epoch.config.allowed_slots.is_secondary_vrf_slots_allowed(), ) } else { @@ -216,39 +228,33 @@ fn claim_primary_slot( slot_number: SlotNumber, epoch: &Epoch, c: (u64, u64), - keystore: &KeyStorePtr, + key_pairs: &[(AuthorityPair, usize)], ) -> Option<(PreDigest, AuthorityPair)> { let Epoch { authorities, randomness, epoch_index, .. } = epoch; - let keystore = keystore.read(); - for (pair, authority_index) in authorities.iter() - .enumerate() - .flat_map(|(i, a)| { - keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) - }) - { + for (pair, authority_index) in key_pairs { let transcript = super::authorship::make_transcript(randomness, slot_number, *epoch_index); // Compute the threshold we will use. // // We already checked that authorities contains `key.public()`, so it can't // be empty. Therefore, this division in `calculate_threshold` is safe. - let threshold = super::authorship::calculate_primary_threshold(c, authorities, authority_index); + let threshold = super::authorship::calculate_primary_threshold(c, authorities, *authority_index); - let pre_digest = get_keypair(&pair) + let pre_digest = get_keypair(pair) .vrf_sign_after_check(transcript, |inout| super::authorship::check_primary_threshold(inout, threshold)) .map(|s| { PreDigest::Primary(PrimaryPreDigest { slot_number, vrf_output: VRFOutput(s.0.to_output()), vrf_proof: VRFProof(s.1), - authority_index: authority_index as u32, + authority_index: *authority_index as u32, }) }); // early exit on first successful claim if let Some(pre_digest) = pre_digest { - return Some((pre_digest, pair)); + return Some((pre_digest, pair.clone())); } } diff --git a/client/consensus/babe/src/aux_schema.rs b/client/consensus/babe/src/aux_schema.rs index 2a3f23981d..4f26568d83 100644 --- a/client/consensus/babe/src/aux_schema.rs +++ b/client/consensus/babe/src/aux_schema.rs @@ -112,7 +112,7 @@ pub(crate) fn write_epoch_changes( /// Write the cumulative chain-weight of a block ot aux storage. pub(crate) fn write_block_weight( block_hash: H, - block_weight: &BabeBlockWeight, + block_weight: BabeBlockWeight, write_aux: F, ) -> R where F: FnOnce(&[(Vec, &[u8])]) -> R, diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 678a33cbcc..d6498c119b 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -78,7 +78,6 @@ use std::{ collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}, any::Any, borrow::Cow }; -use sp_consensus_babe; use sp_consensus::{ImportResult, CanAuthorWith}; use sp_consensus::import_queue::{ BoxJustificationImport, BoxFinalityProofImport, @@ -186,7 +185,7 @@ impl Epoch { start_slot: slot_number, duration: genesis_config.epoch_length, authorities: genesis_config.genesis_authorities.clone(), - randomness: genesis_config.randomness.clone(), + randomness: genesis_config.randomness, config: BabeEpochConfiguration { c: genesis_config.c, allowed_slots: genesis_config.allowed_slots, @@ -399,7 +398,7 @@ pub fn start_babe(BabeParams { register_babe_inherent_data_provider(&inherent_data_providers, config.slot_duration())?; sc_consensus_uncles::register_uncles_inherent_data_provider( - client.clone(), + client, select_chain.clone(), &inherent_data_providers, )?; @@ -494,7 +493,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork &self.keystore, ); - if let Some(_) = s { + if s.is_some() { debug!(target: "babe", "Claimed slot {}", slot_number); } @@ -796,7 +795,7 @@ impl Verifier for BabeVerifier where // FIXME #1019 in the future, alter this queue to allow deferring of headers let v_params = verification::VerificationParams { header: header.clone(), - pre_digest: Some(pre_digest.clone()), + pre_digest: Some(pre_digest), slot_now: slot_now + 1, epoch: viable_epoch.as_ref(), }; @@ -952,7 +951,7 @@ impl BlockImport for BabeBlockImport>, ) -> Result { let hash = block.post_hash(); - let number = block.header.number().clone(); + let number = *block.header.number(); // early exit if block already in chain, otherwise the check for // epoch changes will error when trying to re-import an epoch change @@ -1133,7 +1132,7 @@ impl BlockImport for BabeBlockImport BlockImport for BabeBlockImport BlockImport for BabeBlockImport( register_babe_inherent_data_provider(&inherent_data_providers, babe_link.config.slot_duration)?; let verifier = BabeVerifier { - client: client.clone(), + client, inherent_data_providers, config: babe_link.config, epoch_changes: babe_link.epoch_changes, -- GitLab From 237d83f1ac80cf512ae43a7a3f26cb72191f6ace Mon Sep 17 00:00:00 2001 From: Denis P Date: Mon, 11 May 2020 11:07:38 +0200 Subject: [PATCH 008/150] fix (ci): hotfix Docker release --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 16c77738c6..6814533506 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -399,6 +399,7 @@ build-linux-substrate: &build-binary - sha256sum ./artifacts/substrate/substrate | tee ./artifacts/substrate/substrate.sha256 - printf '\n# building node-template\n\n' - ./.maintain/node-template-release.sh ./artifacts/substrate/substrate-node-template.tar.gz + - cp -r .maintain/docker/substrate.Dockerfile ./artifacts/substrate/ - sccache -s @@ -416,6 +417,7 @@ build-linux-subkey: &build-subkey sed -n -E 's/^subkey ([0-9.]+.*)/\1/p' | tee ./artifacts/subkey/VERSION; - sha256sum ./artifacts/subkey/subkey | tee ./artifacts/subkey/subkey.sha256 + - cp -r .maintain/docker/subkey.Dockerfile ./artifacts/subkey/ - sccache -s build-macos-subkey: -- GitLab From 29955755ce4fde13284d6c8098b5a82b63bfeb7e Mon Sep 17 00:00:00 2001 From: Denis Pisarev Date: Mon, 11 May 2020 12:29:19 +0200 Subject: [PATCH 009/150] hotfix Docker release (#5968) --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 16c77738c6..6814533506 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -399,6 +399,7 @@ build-linux-substrate: &build-binary - sha256sum ./artifacts/substrate/substrate | tee ./artifacts/substrate/substrate.sha256 - printf '\n# building node-template\n\n' - ./.maintain/node-template-release.sh ./artifacts/substrate/substrate-node-template.tar.gz + - cp -r .maintain/docker/substrate.Dockerfile ./artifacts/substrate/ - sccache -s @@ -416,6 +417,7 @@ build-linux-subkey: &build-subkey sed -n -E 's/^subkey ([0-9.]+.*)/\1/p' | tee ./artifacts/subkey/VERSION; - sha256sum ./artifacts/subkey/subkey | tee ./artifacts/subkey/subkey.sha256 + - cp -r .maintain/docker/subkey.Dockerfile ./artifacts/subkey/ - sccache -s build-macos-subkey: -- GitLab From d272eadeba91aaceee0d4beda6f5337705ef5901 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 11 May 2020 14:31:56 +0200 Subject: [PATCH 010/150] Properly log when we discard a sync response (#5969) --- client/network/src/block_requests.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/network/src/block_requests.rs b/client/network/src/block_requests.rs index b3e7939840..7352c72347 100644 --- a/client/network/src/block_requests.rs +++ b/client/network/src/block_requests.rs @@ -594,6 +594,10 @@ where } else { // We remove from `self.peers` requests we're no longer interested in, // so this can legitimately happen. + log::trace!( + target: "sync", + "Response discarded because it concerns an obsolete request" + ); return; } } else { -- GitLab From 7f73312aa0bf4a4107860141f085e9770ec01b72 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Mon, 11 May 2020 14:32:29 +0200 Subject: [PATCH 011/150] Add crypto identifier to RuntimeAppPublic (#5965) * Add crypto identifier to RuntimeAppPublic * Update primitives/application-crypto/src/traits.rs Co-authored-by: Gavin Wood Co-authored-by: Gavin Wood --- primitives/application-crypto/src/lib.rs | 10 ++++++---- primitives/application-crypto/src/traits.rs | 4 +++- primitives/runtime/src/lib.rs | 2 +- primitives/runtime/src/testing.rs | 3 ++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index 8bad474ede..b69b8b6877 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -25,7 +25,7 @@ pub use sp_core::{self, crypto::{CryptoType, CryptoTypePublicPair, Public, Deriv #[doc(hidden)] #[cfg(feature = "full_crypto")] pub use sp_core::crypto::{SecretStringError, DeriveJunction, Ss58Codec, Pair}; -pub use sp_core::crypto::{KeyTypeId, key_types}; +pub use sp_core::crypto::{KeyTypeId, CryptoTypeId, key_types}; #[doc(hidden)] pub use codec; @@ -55,7 +55,7 @@ pub use traits::*; macro_rules! app_crypto { ($module:ident, $key_type:expr) => { $crate::app_crypto_public_full_crypto!($module::Public, $key_type); - $crate::app_crypto_public_common!($module::Public, $module::Signature, $key_type); + $crate::app_crypto_public_common!($module::Public, $module::Signature, $key_type, $module::CRYPTO_ID); $crate::app_crypto_signature_full_crypto!($module::Signature, $key_type); $crate::app_crypto_signature_common!($module::Signature, $key_type); $crate::app_crypto_pair!($module::Pair, $key_type); @@ -76,7 +76,7 @@ macro_rules! app_crypto { macro_rules! app_crypto { ($module:ident, $key_type:expr) => { $crate::app_crypto_public_not_full_crypto!($module::Public, $key_type); - $crate::app_crypto_public_common!($module::Public, $module::Signature, $key_type); + $crate::app_crypto_public_common!($module::Public, $module::Signature, $key_type, $module::CRYPTO_ID); $crate::app_crypto_signature_not_full_crypto!($module::Signature, $key_type); $crate::app_crypto_signature_common!($module::Signature, $key_type); }; @@ -246,7 +246,7 @@ macro_rules! app_crypto_public_not_full_crypto { #[doc(hidden)] #[macro_export] macro_rules! app_crypto_public_common { - ($public:ty, $sig:ty, $key_type:expr) => { + ($public:ty, $sig:ty, $key_type:expr, $crypto_type:expr) => { $crate::app_crypto_public_common_if_std!(); impl AsRef<[u8]> for Public { @@ -267,6 +267,8 @@ macro_rules! app_crypto_public_common { impl $crate::RuntimeAppPublic for Public where $public: $crate::RuntimePublic { const ID: $crate::KeyTypeId = $key_type; + const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; + type Signature = Signature; fn all() -> $crate::Vec { diff --git a/primitives/application-crypto/src/traits.rs b/primitives/application-crypto/src/traits.rs index 2af039a88d..2983b143df 100644 --- a/primitives/application-crypto/src/traits.rs +++ b/primitives/application-crypto/src/traits.rs @@ -18,7 +18,7 @@ use sp_core::crypto::Pair; use codec::Codec; -use sp_core::crypto::{KeyTypeId, CryptoType, IsWrappedBy, Public}; +use sp_core::crypto::{KeyTypeId, CryptoType, CryptoTypeId, IsWrappedBy, Public}; use sp_std::{fmt::Debug, vec::Vec}; /// An application-specific key. @@ -115,6 +115,8 @@ pub trait RuntimePublic: Sized { pub trait RuntimeAppPublic: Sized { /// An identifier for this application-specific key type. const ID: KeyTypeId; + /// The identifier of the crypto type of this application-specific key type. + const CRYPTO_ID: CryptoTypeId; /// The signature that will be generated when signing with the corresponding private key. type Signature: Codec + Debug + MaybeHash + Eq + PartialEq + Clone; diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index a5b3e71edc..b55edbd88d 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -62,7 +62,7 @@ pub use crate::runtime_string::*; pub use generic::{DigestItem, Digest}; /// Re-export this since it's part of the API of this crate. -pub use sp_core::{TypeId, crypto::{key_types, KeyTypeId, CryptoType, AccountId32}}; +pub use sp_core::{TypeId, crypto::{key_types, KeyTypeId, CryptoType, CryptoTypeId, AccountId32}}; pub use sp_application_crypto::{RuntimeAppPublic, BoundToRuntimeAppPublic}; /// Re-export `RuntimeDebug`, to avoid dependency clutter. diff --git a/primitives/runtime/src/testing.rs b/primitives/runtime/src/testing.rs index 40b4e23e3f..333f78f515 100644 --- a/primitives/runtime/src/testing.rs +++ b/primitives/runtime/src/testing.rs @@ -24,7 +24,7 @@ use crate::traits::{ SignedExtension, Dispatchable, DispatchInfoOf, }; use crate::traits::ValidateUnsigned; -use crate::{generic, KeyTypeId, ApplyExtrinsicResult}; +use crate::{generic, KeyTypeId, CryptoTypeId, ApplyExtrinsicResult}; pub use sp_core::{H256, sr25519}; use sp_core::{crypto::{CryptoType, Dummy, key_types, Public}, U256}; use crate::transaction_validity::{TransactionValidity, TransactionValidityError, TransactionSource}; @@ -86,6 +86,7 @@ impl UintAuthorityId { impl sp_application_crypto::RuntimeAppPublic for UintAuthorityId { const ID: KeyTypeId = key_types::DUMMY; + const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"dumm"); type Signature = TestSignature; -- GitLab From 65f742b1aadf1464711f9cf9f04a5dc0fd0cdffe Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 11 May 2020 17:39:39 +0200 Subject: [PATCH 012/150] Small fix to block response completion reporting (#5967) * Small fix to block response completion reporting * while -> if --- client/network/src/block_requests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/network/src/block_requests.rs b/client/network/src/block_requests.rs index 7352c72347..91e9983192 100644 --- a/client/network/src/block_requests.rs +++ b/client/network/src/block_requests.rs @@ -708,12 +708,12 @@ where } } - while let Poll::Ready(Some((peer, total_handling_time))) = self.outgoing.poll_next_unpin(cx) { + if let Poll::Ready(Some((peer, total_handling_time))) = self.outgoing.poll_next_unpin(cx) { let ev = Event::AnsweredRequest { peer, total_handling_time, }; - self.pending_events.push_back(NetworkBehaviourAction::GenerateEvent(ev)); + return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } Poll::Pending -- GitLab From aaf0144ce8eb09acdd20ebb9650cdc71898da08b Mon Sep 17 00:00:00 2001 From: Jimmy Chu Date: Mon, 11 May 2020 23:44:20 +0800 Subject: [PATCH 013/150] Minor update on example-offchain-worker code and comment (#5970) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Minor update on example-offchain-worker code and comment Signed-off-by: Jimmy Chu * Update frame/system/src/offchain.rs Co-authored-by: Bastian Köcher --- frame/example-offchain-worker/src/lib.rs | 4 +--- frame/system/src/offchain.rs | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frame/example-offchain-worker/src/lib.rs b/frame/example-offchain-worker/src/lib.rs index e2c0099094..c3a269e46d 100644 --- a/frame/example-offchain-worker/src/lib.rs +++ b/frame/example-offchain-worker/src/lib.rs @@ -45,7 +45,7 @@ use frame_system::{ ensure_signed, ensure_none, offchain::{ - AppCrypto, CreateSignedTransaction, SendUnsignedTransaction, + AppCrypto, CreateSignedTransaction, SendUnsignedTransaction, SendSignedTransaction, SignedPayload, SigningTypes, Signer, SubmitTransaction, } }; @@ -381,8 +381,6 @@ impl Module { /// A helper function to fetch the price and send signed transaction. fn fetch_price_and_send_signed() -> Result<(), &'static str> { - use frame_system::offchain::SendSignedTransaction; - let signer = Signer::::all_accounts(); if !signer.can_sign() { return Err( diff --git a/frame/system/src/offchain.rs b/frame/system/src/offchain.rs index 04cd3001e4..43003d657e 100644 --- a/frame/system/src/offchain.rs +++ b/frame/system/src/offchain.rs @@ -382,6 +382,7 @@ impl Clone for Account where /// ```ignore /// // im-online specific crypto /// type RuntimeAppPublic = ImOnline(sr25519::Public); +/// /// // wrapped "raw" crypto /// type GenericPublic = sr25519::Public; /// type GenericSignature = sr25519::Signature; -- GitLab From 3fe26e6efa3a70eb6606292a45370cb3326f1794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 11 May 2020 23:33:32 +0200 Subject: [PATCH 014/150] Update initialize tests for latest rust stable (#5971) * Update initialize tests for latest rust stable * Update more tests * AHHH * Fix `runtime-interface` test * ------------------------______________---------------------- * ... --- .../reserved_keyword/on_initialize.stderr | 20 ++++++------- .../ui/empty_impl_runtime_apis_call.stderr | 4 ++- .../ui/impl_incorrect_method_signature.stderr | 20 ++++--------- .../tests/ui/mock_only_one_error_type.stderr | 6 ++-- .../tests/ui/mock_only_self_reference.stderr | 26 +++-------------- ...reference_in_impl_runtime_apis_call.stderr | 20 ++++--------- primitives/runtime-interface/test/src/lib.rs | 28 ++++++++++--------- .../tests/ui/pass_by_enum_with_struct.stderr | 2 ++ .../ui/pass_by_enum_with_value_variant.stderr | 2 ++ .../ui/pass_by_inner_with_two_fields.stderr | 2 ++ 10 files changed, 50 insertions(+), 80 deletions(-) diff --git a/frame/support/test/tests/reserved_keyword/on_initialize.stderr b/frame/support/test/tests/reserved_keyword/on_initialize.stderr index e899ef5d78..dbe07195e8 100644 --- a/frame/support/test/tests/reserved_keyword/on_initialize.stderr +++ b/frame/support/test/tests/reserved_keyword/on_initialize.stderr @@ -2,38 +2,38 @@ error: Invalid call fn name: `on_finalize`, name is reserved and doesn't match e --> $DIR/on_initialize.rs:31:1 | 31 | reserved!(on_finalize on_initialize on_runtime_upgrade offchain_worker deposit_event); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: Invalid call fn name: `on_initialize`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. --> $DIR/on_initialize.rs:31:1 | 31 | reserved!(on_finalize on_initialize on_runtime_upgrade offchain_worker deposit_event); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: Invalid call fn name: `on_runtime_upgrade`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. --> $DIR/on_initialize.rs:31:1 | 31 | reserved!(on_finalize on_initialize on_runtime_upgrade offchain_worker deposit_event); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: Invalid call fn name: `offchain_worker`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. --> $DIR/on_initialize.rs:31:1 | 31 | reserved!(on_finalize on_initialize on_runtime_upgrade offchain_worker deposit_event); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: Invalid call fn name: `deposit_event`, name is reserved and doesn't match expected signature, please refer to `decl_module!` documentation to see the appropriate usage, or rename it to an unreserved keyword. --> $DIR/on_initialize.rs:31:1 | 31 | reserved!(on_finalize on_initialize on_runtime_upgrade offchain_worker deposit_event); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/primitives/api/test/tests/ui/empty_impl_runtime_apis_call.stderr b/primitives/api/test/tests/ui/empty_impl_runtime_apis_call.stderr index f927912879..b08f056b57 100644 --- a/primitives/api/test/tests/ui/empty_impl_runtime_apis_call.stderr +++ b/primitives/api/test/tests/ui/empty_impl_runtime_apis_call.stderr @@ -2,4 +2,6 @@ error: No api implementation given! --> $DIR/empty_impl_runtime_apis_call.rs:17:1 | 17 | sp_api::impl_runtime_apis! {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr b/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr index 4f112e91bb..46f138fccd 100644 --- a/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr +++ b/primitives/api/test/tests/ui/impl_incorrect_method_signature.stderr @@ -21,20 +21,11 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr | |_- type in trait 16 | 17 | sp_api::impl_runtime_apis! { - | -^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | _expected `u64`, found struct `std::string::String` - | | -18 | | impl self::Api for Runtime { -19 | | fn test(data: String) {} -20 | | } -... | -32 | | } -33 | | } - | |_- in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u64`, found struct `std::string::String` | = note: expected fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` found fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0308]: mismatched types --> $DIR/impl_incorrect_method_signature.rs:17:1 @@ -46,10 +37,9 @@ error[E0308]: mismatched types ... | 32 | | } 33 | | } - | | ^ - | | | - | |_expected `u64`, found struct `std::string::String` - | in this macro invocation + | |_^ expected `u64`, found struct `std::string::String` + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0308]: mismatched types --> $DIR/impl_incorrect_method_signature.rs:19:11 diff --git a/primitives/api/test/tests/ui/mock_only_one_error_type.stderr b/primitives/api/test/tests/ui/mock_only_one_error_type.stderr index 7cec5246ca..b190c2134f 100644 --- a/primitives/api/test/tests/ui/mock_only_one_error_type.stderr +++ b/primitives/api/test/tests/ui/mock_only_one_error_type.stderr @@ -14,10 +14,7 @@ error[E0277]: the trait bound `u32: std::convert::From` is ... | 26 | | } 27 | | } - | | ^ - | | | - | |_the trait `std::convert::From` is not implemented for `u32` - | in this macro invocation + | |_^ the trait `std::convert::From` is not implemented for `u32` | = help: the following implementations were found: > @@ -25,3 +22,4 @@ error[E0277]: the trait bound `u32: std::convert::From` is > > and 18 others + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/primitives/api/test/tests/ui/mock_only_self_reference.stderr b/primitives/api/test/tests/ui/mock_only_self_reference.stderr index 9c1658b0a6..6d1ac0e9a2 100644 --- a/primitives/api/test/tests/ui/mock_only_self_reference.stderr +++ b/primitives/api/test/tests/ui/mock_only_self_reference.stderr @@ -22,20 +22,11 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr | |_- type in trait ... 12 | sp_api::mock_impl_runtime_apis! { - | -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | _expected `u64`, found `()` - | | -13 | | impl Api for MockApi { -14 | | fn test(self, data: u64) {} -15 | | -16 | | fn test2(&mut self, data: u64) {} -17 | | } -18 | | } - | |_- in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u64`, found `()` | = note: expected fn pointer `fn(&MockApi, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` found fn pointer `fn(&MockApi, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<()>, std::vec::Vec<_>) -> std::result::Result<_, _>` + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0053]: method `Api_test2_runtime_api_impl` has an incompatible type for trait --> $DIR/mock_only_self_reference.rs:12:1 @@ -49,17 +40,8 @@ error[E0053]: method `Api_test2_runtime_api_impl` has an incompatible type for t | |_- type in trait ... 12 | sp_api::mock_impl_runtime_apis! { - | -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | _expected `u64`, found `()` - | | -13 | | impl Api for MockApi { -14 | | fn test(self, data: u64) {} -15 | | -16 | | fn test2(&mut self, data: u64) {} -17 | | } -18 | | } - | |_- in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u64`, found `()` | = note: expected fn pointer `fn(&MockApi, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` found fn pointer `fn(&MockApi, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId, substrate_test_runtime::Extrinsic>>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<()>, std::vec::Vec<_>) -> std::result::Result<_, _>` + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr index 1d7d0a78a8..cc2a5f05cd 100644 --- a/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr +++ b/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.stderr @@ -21,20 +21,11 @@ error[E0053]: method `Api_test_runtime_api_impl` has an incompatible type for tr | |_- type in trait 16 | 17 | sp_api::impl_runtime_apis! { - | -^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | _expected `u64`, found `&u64` - | | -18 | | impl self::Api for Runtime { -19 | | fn test(data: &u64) { -20 | | unimplemented!() -... | -34 | | } -35 | | } - | |_- in this macro invocation + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u64`, found `&u64` | = note: expected fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option, std::vec::Vec<_>) -> std::result::Result<_, _>` found fn pointer `fn(&RuntimeApiImpl<__SR_API_BLOCK__, RuntimeApiImplCall>, &sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::BlockId<__SR_API_BLOCK__>, sp_api_hidden_includes_DECL_RUNTIME_APIS::sp_api::ExecutionContext, std::option::Option<&u64>, std::vec::Vec<_>) -> std::result::Result<_, _>` + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0308]: mismatched types --> $DIR/type_reference_in_impl_runtime_apis_call.rs:17:1 @@ -46,10 +37,9 @@ error[E0308]: mismatched types ... | 34 | | } 35 | | } - | | ^ - | | | - | |_expected `u64`, found `&u64` - | in this macro invocation + | |_^ expected `u64`, found `&u64` + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0308]: mismatched types --> $DIR/type_reference_in_impl_runtime_apis_call.rs:19:11 diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index e7ef1934e2..57be4d03b1 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -31,7 +31,10 @@ use std::{collections::HashSet, sync::{Arc, Mutex}}; type TestExternalities = sp_state_machine::TestExternalities; -fn call_wasm_method(binary: &[u8], method: &str) -> TestExternalities { +fn call_wasm_method_with_result( + binary: &[u8], + method: &str, +) -> Result { let mut ext = TestExternalities::default(); let mut ext_ext = ext.ext(); let mut host_functions = HF::host_functions(); @@ -50,9 +53,13 @@ fn call_wasm_method(binary: &[u8], method: &str) -> TestExte &[], &mut ext_ext, sp_core::traits::MissingHostFunctions::Disallow, - ).expect(&format!("Executes `{}`", method)); + ).map_err(|e| format!("Failed to execute `{}`: {}", method, e))?; - ext + Ok(ext) +} + +fn call_wasm_method(binary: &[u8], method: &str) -> TestExternalities { + call_wasm_method_with_result::(binary, method).unwrap() } #[test] @@ -94,20 +101,15 @@ fn test_return_input_public_key() { } #[test] -#[should_panic( - expected = "Instantiation: Export ext_test_api_return_input_version_1 not found" -)] fn host_function_not_found() { - call_wasm_method::<()>(&WASM_BINARY[..], "test_return_data"); + let err = call_wasm_method_with_result::<()>(&WASM_BINARY[..], "test_return_data").unwrap_err(); + + assert!(err.contains("Instantiation: Export ")); + assert!(err.contains(" not found")); } #[test] -#[should_panic( - expected = - "Executes `test_invalid_utf8_data_should_return_an_error`: \ - \"Trap: Trap { kind: Host(FunctionExecution(\\\"ext_test_api_invalid_utf8_data_version_1\\\", \ - \\\"Invalid utf8 data provided\\\")) }\"" -)] +#[should_panic(expected = "Invalid utf8 data provided")] fn test_invalid_utf8_data_should_return_an_error() { call_wasm_method::(&WASM_BINARY[..], "test_invalid_utf8_data_should_return_an_error"); } diff --git a/primitives/runtime-interface/tests/ui/pass_by_enum_with_struct.stderr b/primitives/runtime-interface/tests/ui/pass_by_enum_with_struct.stderr index 6502a36fc1..c7ed1af3b1 100644 --- a/primitives/runtime-interface/tests/ui/pass_by_enum_with_struct.stderr +++ b/primitives/runtime-interface/tests/ui/pass_by_enum_with_struct.stderr @@ -3,3 +3,5 @@ error: `PassByEnum` only supports enums as input type. | 3 | #[derive(PassByEnum)] | ^^^^^^^^^^ + | + = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/primitives/runtime-interface/tests/ui/pass_by_enum_with_value_variant.stderr b/primitives/runtime-interface/tests/ui/pass_by_enum_with_value_variant.stderr index 1f03436d4e..f6c85ed2bb 100644 --- a/primitives/runtime-interface/tests/ui/pass_by_enum_with_value_variant.stderr +++ b/primitives/runtime-interface/tests/ui/pass_by_enum_with_value_variant.stderr @@ -3,3 +3,5 @@ error: `PassByEnum` only supports unit variants. | 3 | #[derive(PassByEnum)] | ^^^^^^^^^^ + | + = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/primitives/runtime-interface/tests/ui/pass_by_inner_with_two_fields.stderr b/primitives/runtime-interface/tests/ui/pass_by_inner_with_two_fields.stderr index 7f576a69f0..9afbce76f0 100644 --- a/primitives/runtime-interface/tests/ui/pass_by_inner_with_two_fields.stderr +++ b/primitives/runtime-interface/tests/ui/pass_by_inner_with_two_fields.stderr @@ -3,3 +3,5 @@ error: Only newtype/one field structs are supported by `PassByInner`! | 3 | #[derive(PassByInner)] | ^^^^^^^^^^^ + | + = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -- GitLab From 62e7245e0eb5437905313120c22d305b1c3038f9 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 12 May 2020 11:46:06 +0200 Subject: [PATCH 015/150] Allow passing multiple --log CLI options (#5982) * Allow passing multiple --log CLI options * Comment typo --- client/cli/src/commands/mod.rs | 2 +- client/cli/src/config.rs | 11 +++++++---- client/cli/src/params/shared_params.rs | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/client/cli/src/commands/mod.rs b/client/cli/src/commands/mod.rs index d2bab5bca0..54a6f9b743 100644 --- a/client/cli/src/commands/mod.rs +++ b/client/cli/src/commands/mod.rs @@ -396,7 +396,7 @@ macro_rules! substrate_cli_subcommands { } } - fn log_filters(&self) -> $crate::Result<::std::option::Option> { + fn log_filters(&self) -> $crate::Result { match self { $($enum::$variant(cmd) => cmd.log_filters()),* } diff --git a/client/cli/src/config.rs b/client/cli/src/config.rs index f2a6715cf2..56830f2076 100644 --- a/client/cli/src/config.rs +++ b/client/cli/src/config.rs @@ -472,9 +472,12 @@ pub trait CliConfiguration: Sized { /// Get the filters for the logging. /// + /// This should be a list of comma-separated values. + /// Example: `foo=trace,bar=debug,baz=info` + /// /// By default this is retrieved from `SharedParams`. - fn log_filters(&self) -> Result> { - Ok(self.shared_params().log_filters()) + fn log_filters(&self) -> Result { + Ok(self.shared_params().log_filters().join(",")) } /// Initialize substrate. This must be done only once. @@ -485,12 +488,12 @@ pub trait CliConfiguration: Sized { /// 2. Raise the FD limit /// 3. Initialize the logger fn init(&self) -> Result<()> { - let logger_pattern = self.log_filters()?.unwrap_or_default(); + let logger_pattern = self.log_filters()?; sp_panic_handler::set(C::support_url(), C::impl_version()); fdlimit::raise_fd_limit(); - init_logger(logger_pattern.as_str()); + init_logger(&logger_pattern); Ok(()) } diff --git a/client/cli/src/params/shared_params.rs b/client/cli/src/params/shared_params.rs index 68c9a30453..c8381cd069 100644 --- a/client/cli/src/params/shared_params.rs +++ b/client/cli/src/params/shared_params.rs @@ -42,7 +42,7 @@ pub struct SharedParams { /// Log levels (least to most verbose) are error, warn, info, debug, and trace. /// By default, all targets log `info`. The global log level can be set with -l. #[structopt(short = "l", long = "log", value_name = "LOG_PATTERN")] - pub log: Option, + pub log: Vec, } impl SharedParams { @@ -71,7 +71,7 @@ impl SharedParams { } /// Get the filters for the logging - pub fn log_filters(&self) -> Option { - self.log.clone() + pub fn log_filters(&self) -> &[String] { + &self.log } } -- GitLab From e8b9b3850768866563dd4170d2c3b7bb4933fe68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 12 May 2020 12:13:28 +0200 Subject: [PATCH 016/150] Optimize `decode_len` (#5975) * Optimize `decode_len` Instead of reading the full storage value into the runtime, we only read at maximum `5bytes` from the storage into the runtime. Furthermore this drops any handling with regards to set default values in `decl_storage!`. If the value does not exists or the decoding of the length fails, it will return `None`. To prevent people from messing stuff up, this feature relies on the `StorageDecodeLength` trait that is sealed by `frame-support` (aka only implementable inside this crate). * Some clean ups * Update frame/support/src/storage/mod.rs Co-authored-by: Alexander Popiak Co-authored-by: Alexander Popiak --- frame/elections-phragmen/src/lib.rs | 10 +-- frame/staking/src/lib.rs | 2 +- .../src/storage/generator/double_map.rs | 19 +--- frame/support/src/storage/generator/map.rs | 21 +---- frame/support/src/storage/generator/value.rs | 16 ---- frame/support/src/storage/mod.rs | 88 ++++++++++++++----- frame/support/test/tests/decl_storage.rs | 22 ++--- 7 files changed, 91 insertions(+), 87 deletions(-) diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 040ef00ac2..05f4d1e83d 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -277,9 +277,9 @@ decl_module! { fn vote(origin, votes: Vec, #[compact] value: BalanceOf) { let who = ensure_signed(origin)?; - let candidates_count = >::decode_len().unwrap_or(0) as usize; - let members_count = >::decode_len().unwrap_or(0) as usize; - let runners_up_count = >::decode_len().unwrap_or(0) as usize; + let candidates_count = >::decode_len().unwrap_or(0); + let members_count = >::decode_len().unwrap_or(0); + let runners_up_count = >::decode_len().unwrap_or(0); // addition is valid: candidates, members and runners-up will never overlap. let allowed_votes = candidates_count + members_count + runners_up_count; @@ -1196,7 +1196,7 @@ mod tests { assert_eq!(Elections::runners_up(), vec![]); assert_eq!(Elections::candidates(), vec![]); - assert_eq!(>::decode_len().unwrap(), 0); + assert_eq!(>::decode_len(), None); assert!(Elections::is_candidate(&1).is_err()); assert_eq!(all_voters(), vec![]); @@ -1800,7 +1800,7 @@ mod tests { assert_eq!(Elections::runners_up(), vec![]); assert_eq_uvec!(all_voters(), vec![2, 3, 4]); assert_eq!(Elections::candidates(), vec![]); - assert_eq!(>::decode_len().unwrap(), 0); + assert_eq!(>::decode_len(), None); assert_eq!(Elections::election_rounds(), 1); }); diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 534222ebdf..71042d69b3 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -2337,7 +2337,7 @@ impl Module { // that we need. Then it should be Self::validator_count(). Else it should be all the // candidates. let snapshot_length = >::decode_len() - .map_err(|_| Error::::SnapshotUnavailable)?; + .ok_or_else(|| Error::::SnapshotUnavailable)?; // check the winner length only here and when we know the length of the snapshot validators // length. diff --git a/frame/support/src/storage/generator/double_map.rs b/frame/support/src/storage/generator/double_map.rs index 2c18089d38..722a9dcabc 100644 --- a/frame/support/src/storage/generator/double_map.rs +++ b/frame/support/src/storage/generator/double_map.rs @@ -17,7 +17,7 @@ use sp_std::prelude::*; use sp_std::borrow::Borrow; use codec::{FullCodec, FullEncode, Decode, Encode, EncodeLike}; -use crate::{storage::{self, unhashed, StorageAppend}, traits::Len, Never}; +use crate::{storage::{self, unhashed, StorageAppend}, Never}; use crate::hash::{StorageHasher, Twox128, ReversibleStorageHasher}; /// Generator for `StorageDoubleMap` used by `decl_storage`. @@ -260,23 +260,6 @@ impl storage::StorageDoubleMap for G where sp_io::storage::append(&final_key, item.encode()); } - fn decode_len(key1: KArg1, key2: KArg2) -> Result where - KArg1: EncodeLike, - KArg2: EncodeLike, - V: codec::DecodeLength + Len, - { - let final_key = Self::storage_double_map_final_key(key1, key2); - if let Some(v) = unhashed::get_raw(&final_key) { - ::len(&v).map_err(|e| e.what()) - } else { - let len = G::from_query_to_optional_value(G::from_optional_value_to_query(None)) - .map(|v| v.len()) - .unwrap_or(0); - - Ok(len) - } - } - fn migrate_keys< OldHasher1: StorageHasher, OldHasher2: StorageHasher, diff --git a/frame/support/src/storage/generator/map.rs b/frame/support/src/storage/generator/map.rs index 307e3b1c78..fa870ac075 100644 --- a/frame/support/src/storage/generator/map.rs +++ b/frame/support/src/storage/generator/map.rs @@ -18,8 +18,10 @@ use sp_std::prelude::*; use sp_std::borrow::Borrow; use codec::{FullCodec, FullEncode, Decode, Encode, EncodeLike}; -use crate::{storage::{self, unhashed, StorageAppend}, traits::Len, Never}; -use crate::hash::{StorageHasher, Twox128, ReversibleStorageHasher}; +use crate::{ + storage::{self, unhashed, StorageAppend}, + Never, hash::{StorageHasher, Twox128, ReversibleStorageHasher}, +}; /// Generator for `StorageMap` used by `decl_storage`. /// @@ -287,21 +289,6 @@ impl> storage::StorageMap sp_io::storage::append(&key, item.encode()); } - fn decode_len>(key: KeyArg) -> Result - where V: codec::DecodeLength + Len - { - let key = Self::storage_map_final_key(key); - if let Some(v) = unhashed::get_raw(key.as_ref()) { - ::len(&v).map_err(|e| e.what()) - } else { - let len = G::from_query_to_optional_value(G::from_optional_value_to_query(None)) - .map(|v| v.len()) - .unwrap_or(0); - - Ok(len) - } - } - fn migrate_key>(key: KeyArg) -> Option { let old_key = { let module_prefix_hashed = Twox128::hash(Self::module_prefix()); diff --git a/frame/support/src/storage/generator/value.rs b/frame/support/src/storage/generator/value.rs index f4119ba461..9cc36b6372 100644 --- a/frame/support/src/storage/generator/value.rs +++ b/frame/support/src/storage/generator/value.rs @@ -19,7 +19,6 @@ use crate::{ Never, storage::{self, unhashed, StorageAppend}, hash::{Twox128, StorageHasher}, - traits::Len }; /// Generator for `StorageValue` used by `decl_storage`. @@ -141,19 +140,4 @@ impl> storage::StorageValue for G { let key = Self::storage_value_final_key(); sp_io::storage::append(&key, item.encode()); } - - fn decode_len() -> Result where T: codec::DecodeLength, T: Len { - let key = Self::storage_value_final_key(); - - // attempt to get the length directly. - if let Some(k) = unhashed::get_raw(&key) { - ::len(&k).map_err(|e| e.what()) - } else { - let len = G::from_query_to_optional_value(G::from_optional_value_to_query(None)) - .map(|v| v.len()) - .unwrap_or(0); - - Ok(len) - } - } } diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index cdbdcbc6ff..9214d931e3 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -18,7 +18,7 @@ use sp_std::{prelude::*, marker::PhantomData}; use codec::{FullCodec, FullEncode, Encode, EncodeLike, Decode}; -use crate::{traits::Len, hash::{Twox128, StorageHasher}}; +use crate::hash::{Twox128, StorageHasher}; use sp_runtime::generic::{Digest, DigestItem}; pub mod unhashed; @@ -105,11 +105,20 @@ pub trait StorageValue { EncodeLikeItem: EncodeLike, T: StorageAppend; - /// Read the length of the value in a fast way, without decoding the entire value. + /// Read the length of the storage value without decoding the entire value. /// - /// `T` is required to implement `Codec::DecodeLength`. - fn decode_len() -> Result - where T: codec::DecodeLength + Len; + /// `T` is required to implement [`StorageDecodeLength`]. + /// + /// If the value does not exists or it fails to decode the length, `None` is returned. + /// Otherwise `Some(len)` is returned. + /// + /// # Warning + /// + /// `None` does not mean that `get()` does not return a value. The default value is completly + /// ignored by this function. + fn decode_len() -> Option where T: StorageDecodeLength { + T::decode_len(&Self::hashed_key()) + } } /// A strongly-typed map in storage. @@ -175,15 +184,23 @@ pub trait StorageMap { EncodeLikeItem: EncodeLike, V: StorageAppend; - /// Read the length of the value in a fast way, without decoding the entire value. + /// Read the length of the storage value without decoding the entire value under the + /// given `key`. + /// + /// `V` is required to implement [`StorageDecodeLength`]. /// - /// `T` is required to implement `Codec::DecodeLength`. + /// If the value does not exists or it fails to decode the length, `None` is returned. + /// Otherwise `Some(len)` is returned. /// - /// Note that `0` is returned as the default value if no encoded value exists at the given key. - /// Therefore, this function cannot be used as a sign of _existence_. use the `::contains_key()` - /// function for this purpose. - fn decode_len>(key: KeyArg) -> Result - where V: codec::DecodeLength + Len; + /// # Warning + /// + /// `None` does not mean that `get()` does not return a value. The default value is completly + /// ignored by this function. + fn decode_len>(key: KeyArg) -> Option + where V: StorageDecodeLength, + { + V::decode_len(&Self::hashed_key_for(key)) + } /// Migrate an item with the given `key` from a defunct `OldHasher` to the current hasher. /// @@ -348,18 +365,26 @@ pub trait StorageDoubleMap { EncodeLikeItem: EncodeLike, V: StorageAppend; - /// Read the length of the value in a fast way, without decoding the entire value. + /// Read the length of the storage value without decoding the entire value under the + /// given `key1` and `key2`. + /// + /// `V` is required to implement [`StorageDecodeLength`]. /// - /// `V` is required to implement `Codec::DecodeLength`. + /// If the value does not exists or it fails to decode the length, `None` is returned. + /// Otherwise `Some(len)` is returned. /// - /// Note that `0` is returned as the default value if no encoded value exists at the given key. - /// Therefore, this function cannot be used as a sign of _existence_. use the `::contains_key()` - /// function for this purpose. - fn decode_len(key1: KArg1, key2: KArg2) -> Result + /// # Warning + /// + /// `None` does not mean that `get()` does not return a value. The default value is completly + /// ignored by this function. + fn decode_len(key1: KArg1, key2: KArg2) -> Option where KArg1: EncodeLike, KArg2: EncodeLike, - V: codec::DecodeLength + Len; + V: StorageDecodeLength, + { + V::decode_len(&Self::hashed_key_for(key1, key2)) + } /// Migrate an item with the given `key1` and `key2` from defunct `OldHasher1` and /// `OldHasher2` to the current hashers. @@ -493,7 +518,29 @@ pub trait StoragePrefixedMap { /// This trait is sealed. pub trait StorageAppend: private::Sealed {} -/// Provides `Sealed` trait to prevent implementing trait `StorageAppend` outside of this crate. +/// Marker trait that will be implemented for types that support to decode their length in an +/// effificent way. It is expected that the length is at the beginning of the encoded object +/// and that the length is a `Compact`. +/// +/// This trait is sealed. +pub trait StorageDecodeLength: private::Sealed + codec::DecodeLength { + /// Decode the length of the storage value at `key`. + /// + /// This function assumes that the length is at the beginning of the encoded object + /// and is a `Compact`. + /// + /// Returns `None` if the storage value does not exist or the decoding failed. + fn decode_len(key: &[u8]) -> Option { + // `Compact` is 5 bytes in maximum. + let mut data = [0u8; 5]; + let len = sp_io::storage::read(key, &mut data, 0)?; + let len = data.len().min(len as usize); + ::len(&data[..len]).ok() + } +} + +/// Provides `Sealed` trait to prevent implementing trait `StorageAppend` & `StorageDecodeLength` +/// outside of this crate. mod private { use super::*; @@ -504,6 +551,7 @@ mod private { } impl StorageAppend for Vec {} +impl StorageDecodeLength for Vec {} /// We abuse the fact that SCALE does not put any marker into the encoding, i.e. /// we only encode the internal vec and we can append to this vec. We have a test that ensures diff --git a/frame/support/test/tests/decl_storage.rs b/frame/support/test/tests/decl_storage.rs index 77e538625a..5ec5bbecfe 100644 --- a/frame/support/test/tests/decl_storage.rs +++ b/frame/support/test/tests/decl_storage.rs @@ -593,38 +593,40 @@ mod test_append_and_len { }); } + // `decode_len` should always return `None` for default assigments + // in `decl_storage!`. #[test] - fn len_works_for_default() { + fn len_works_ignores_default_assignment() { TestExternalities::default().execute_with(|| { // vec assert_eq!(JustVec::get(), vec![]); - assert_eq!(JustVec::decode_len(), Ok(0)); + assert_eq!(JustVec::decode_len(), None); assert_eq!(JustVecWithDefault::get(), vec![6, 9]); - assert_eq!(JustVecWithDefault::decode_len(), Ok(2)); + assert_eq!(JustVecWithDefault::decode_len(), None); assert_eq!(OptionVec::get(), None); - assert_eq!(OptionVec::decode_len(), Ok(0)); + assert_eq!(OptionVec::decode_len(), None); // map assert_eq!(MapVec::get(0), vec![]); - assert_eq!(MapVec::decode_len(0), Ok(0)); + assert_eq!(MapVec::decode_len(0), None); assert_eq!(MapVecWithDefault::get(0), vec![6, 9]); - assert_eq!(MapVecWithDefault::decode_len(0), Ok(2)); + assert_eq!(MapVecWithDefault::decode_len(0), None); assert_eq!(OptionMapVec::get(0), None); - assert_eq!(OptionMapVec::decode_len(0), Ok(0)); + assert_eq!(OptionMapVec::decode_len(0), None); // Double map assert_eq!(DoubleMapVec::get(0, 0), vec![]); - assert_eq!(DoubleMapVec::decode_len(0, 1), Ok(0)); + assert_eq!(DoubleMapVec::decode_len(0, 1), None); assert_eq!(DoubleMapVecWithDefault::get(0, 0), vec![6, 9]); - assert_eq!(DoubleMapVecWithDefault::decode_len(0, 1), Ok(2)); + assert_eq!(DoubleMapVecWithDefault::decode_len(0, 1), None); assert_eq!(OptionDoubleMapVec::get(0, 0), None); - assert_eq!(OptionDoubleMapVec::decode_len(0, 1), Ok(0)); + assert_eq!(OptionDoubleMapVec::decode_len(0, 1), None); }); } } -- GitLab From 494bc3e0e580951d4d1de229e106aab63acf5403 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Tue, 12 May 2020 12:18:32 +0200 Subject: [PATCH 017/150] Split Operational and Normal weight (#5954) * Split operational and normal weight * Update other parts of the code * relatively minor changes to add/fix behavior * Limit reported block weight for fee adjustment * fix test * explicit match * Move common logic out * Update frame/system/src/lib.rs Co-authored-by: Gavin Wood * API improvement @bkchr Co-authored-by: Gavin Wood --- bin/node/runtime/src/impls.rs | 9 +- frame/executive/src/lib.rs | 18 +-- frame/system/src/lib.rs | 220 ++++++++++++++++++++++++++-------- 3 files changed, 185 insertions(+), 62 deletions(-) diff --git a/bin/node/runtime/src/impls.rs b/bin/node/runtime/src/impls.rs index f613dc5af5..878d4b6f0c 100644 --- a/bin/node/runtime/src/impls.rs +++ b/bin/node/runtime/src/impls.rs @@ -70,8 +70,8 @@ pub struct TargetedFeeAdjustment(sp_std::marker::PhantomData); impl> Convert for TargetedFeeAdjustment { fn convert(multiplier: Fixed128) -> Fixed128 { - let block_weight = System::all_extrinsics_weight(); let max_weight = MaximumBlockWeight::get(); + let block_weight = System::all_extrinsics_weight().total().min(max_weight); let target_weight = (T::get() * max_weight) as u128; let block_weight = block_weight as u128; @@ -132,11 +132,12 @@ mod tests { // poc reference implementation. fn fee_multiplier_update(block_weight: Weight, previous: Fixed128) -> Fixed128 { - let block_weight = block_weight as f64; - let v: f64 = 0.00004; - // maximum tx weight let m = max() as f64; + // block weight always truncated to max weight + let block_weight = (block_weight as f64).min(m); + let v: f64 = 0.00004; + // Ideal saturation in terms of weight let ss = target() as f64; // Current saturation in terms of weight diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 742397b624..9c46d86d74 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -116,7 +116,7 @@ use sp_std::{prelude::*, marker::PhantomData}; use frame_support::{ - storage::StorageValue, weights::{GetDispatchInfo, DispatchInfo}, + storage::StorageValue, weights::{GetDispatchInfo, DispatchInfo, DispatchClass}, traits::{OnInitialize, OnFinalize, OnRuntimeUpgrade, OffchainWorker}, }; use sp_runtime::{ @@ -235,7 +235,7 @@ where let mut weight = as OnRuntimeUpgrade>::on_runtime_upgrade(); weight = weight.saturating_add(COnRuntimeUpgrade::on_runtime_upgrade()); weight = weight.saturating_add(::on_runtime_upgrade()); - >::register_extra_weight_unchecked(weight); + >::register_extra_weight_unchecked(weight, DispatchClass::Mandatory); } >::initialize( block_number, @@ -247,7 +247,7 @@ where as OnInitialize>::on_initialize(*block_number); let weight = >::on_initialize(*block_number) .saturating_add(>::get()); - >::register_extra_weight_unchecked(weight); + >::register_extra_weight_unchecked(weight, DispatchClass::Mandatory); frame_system::Module::::note_finished_initialize(); } @@ -785,7 +785,7 @@ mod tests { Digest::default(), )); // Base block execution weight + `on_initialize` weight from the custom module. - assert_eq!(>::all_extrinsics_weight(), base_block_weight); + assert_eq!(>::all_extrinsics_weight().total(), base_block_weight); for nonce in 0..=num_to_exhaust_block { let xt = TestXt::new( @@ -795,7 +795,7 @@ mod tests { if nonce != num_to_exhaust_block { assert!(res.is_ok()); assert_eq!( - >::all_extrinsics_weight(), + >::all_extrinsics_weight().total(), //--------------------- on_initialize + block_execution + extrinsic_base weight (encoded_len + 5) * (nonce + 1) + base_block_weight, ); @@ -815,7 +815,7 @@ mod tests { let len = xt.clone().encode().len() as u32; let mut t = new_test_ext(1); t.execute_with(|| { - assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(>::all_extrinsics_weight().total(), 0); assert_eq!(>::all_extrinsics_len(), 0); assert!(Executive::apply_extrinsic(xt.clone()).unwrap().is_ok()); @@ -824,14 +824,14 @@ mod tests { // default weight for `TestXt` == encoded length. assert_eq!( - >::all_extrinsics_weight(), + >::all_extrinsics_weight().total(), 3 * (len as Weight + ::ExtrinsicBaseWeight::get()), ); assert_eq!(>::all_extrinsics_len(), 3 * len); let _ = >::finalize(); - assert_eq!(>::all_extrinsics_weight(), 0); + assert_eq!(>::all_extrinsics_weight().total(), 0); assert_eq!(>::all_extrinsics_len(), 0); }); } @@ -903,7 +903,7 @@ mod tests { // NOTE: might need updates over time if new weights are introduced. // For now it only accounts for the base block execution weight and // the `on_initialize` weight defined in the custom test module. - assert_eq!(>::all_extrinsics_weight(), 175 + 10); + assert_eq!(>::all_extrinsics_weight().total(), 175 + 10); }) } diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 7219b0f518..ff6893d629 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -357,6 +357,60 @@ impl From for LastRuntimeUpgradeInfo { } } +/// An object to track the currently used extrinsic weight in a block. +#[derive(Clone, Eq, PartialEq, Default, RuntimeDebug, Encode, Decode)] +pub struct ExtrinsicsWeight { + normal: Weight, + operational: Weight, +} + +impl ExtrinsicsWeight { + /// Returns the total weight consumed by all extrinsics in the block. + pub fn total(&self) -> Weight { + self.normal.saturating_add(self.operational) + } + + /// Add some weight of a specific dispatch class, saturating at the numeric bounds of `Weight`. + pub fn add(&mut self, weight: Weight, class: DispatchClass) { + let value = self.get_mut(class); + *value = value.saturating_add(weight); + } + + /// Try to add some weight of a specific dispatch class, returning Err(()) if overflow would occur. + pub fn checked_add(&mut self, weight: Weight, class: DispatchClass) -> Result<(), ()> { + let value = self.get_mut(class); + *value = value.checked_add(weight).ok_or(())?; + Ok(()) + } + + /// Subtract some weight of a specific dispatch class, saturating at the numeric bounds of `Weight`. + pub fn sub(&mut self, weight: Weight, class: DispatchClass) { + let value = self.get_mut(class); + *value = value.saturating_sub(weight); + } + + /// Get the current weight of a specific dispatch class. + pub fn get(&self, class: DispatchClass) -> Weight { + match class { + DispatchClass::Operational => self.operational, + DispatchClass::Normal | DispatchClass::Mandatory => self.normal, + } + } + + /// Get a mutable reference to the current weight of a specific dispatch class. + fn get_mut(&mut self, class: DispatchClass) -> &mut Weight { + match class { + DispatchClass::Operational => &mut self.operational, + DispatchClass::Normal | DispatchClass::Mandatory => &mut self.normal, + } + } + + /// Set the weight of a specific dispatch class. + pub fn put(&mut self, new: Weight, class: DispatchClass) { + *self.get_mut(class) = new; + } +} + decl_storage! { trait Store for Module as System { /// The full account information for a particular account ID. @@ -366,8 +420,8 @@ decl_storage! { /// Total extrinsics count for the current block. ExtrinsicCount: Option; - /// Total weight for all extrinsics put together, for the current block. - AllExtrinsicsWeight: Option; + /// Total weight for all extrinsics for the current block. + AllExtrinsicsWeight: ExtrinsicsWeight; /// Total length (in bytes) for all extrinsics put together, for the current block. AllExtrinsicsLen: Option; @@ -915,9 +969,9 @@ impl Module { ExtrinsicCount::get().unwrap_or_default() } - /// Gets a total weight of all executed extrinsics. - pub fn all_extrinsics_weight() -> Weight { - AllExtrinsicsWeight::get().unwrap_or_default() + /// Gets the weight of all executed extrinsics. + pub fn all_extrinsics_weight() -> ExtrinsicsWeight { + AllExtrinsicsWeight::get() } pub fn all_extrinsics_len() -> u32 { @@ -939,12 +993,10 @@ impl Module { /// of block weight is more than the block weight limit. This is what the _unchecked_. /// /// Another potential use-case could be for the `on_initialize` and `on_finalize` hooks. - /// - /// If no previous weight exists, the function initializes the weight to zero. - pub fn register_extra_weight_unchecked(weight: Weight) { - let current_weight = AllExtrinsicsWeight::get().unwrap_or_default(); - let next_weight = current_weight.saturating_add(weight); - AllExtrinsicsWeight::put(next_weight); + pub fn register_extra_weight_unchecked(weight: Weight, class: DispatchClass) { + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.add(weight, class); + }); } /// Start the execution of a particular block. @@ -1065,7 +1117,9 @@ impl Module { /// Set the current block weight. This should only be used in some integration tests. #[cfg(any(feature = "std", test))] pub fn set_block_limits(weight: Weight, len: usize) { - AllExtrinsicsWeight::put(weight); + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.put(weight, DispatchClass::Normal) + }); AllExtrinsicsLen::put(len as u32); } @@ -1298,24 +1352,49 @@ impl CheckWeight where /// Upon successes, it returns the new block weight as a `Result`. fn check_weight( info: &DispatchInfoOf, - ) -> Result { - let current_weight = Module::::all_extrinsics_weight(); + ) -> Result { let maximum_weight = T::MaximumBlockWeight::get(); - let limit = Self::get_dispatch_limit_ratio(info.class) * maximum_weight; - if info.class == DispatchClass::Mandatory { + let mut all_weight = Module::::all_extrinsics_weight(); + match info.class { // If we have a dispatch that must be included in the block, it ignores all the limits. - let extrinsic_weight = info.weight.saturating_add(T::ExtrinsicBaseWeight::get()); - let next_weight = current_weight.saturating_add(extrinsic_weight); - Ok(next_weight) - } else { - let extrinsic_weight = info.weight.checked_add(T::ExtrinsicBaseWeight::get()) - .ok_or(InvalidTransaction::ExhaustsResources)?; - let next_weight = current_weight.checked_add(extrinsic_weight) - .ok_or(InvalidTransaction::ExhaustsResources)?; - if next_weight > limit { - Err(InvalidTransaction::ExhaustsResources.into()) - } else { - Ok(next_weight) + DispatchClass::Mandatory => { + let extrinsic_weight = info.weight.saturating_add(T::ExtrinsicBaseWeight::get()); + all_weight.add(extrinsic_weight, DispatchClass::Mandatory); + Ok(all_weight) + }, + // If we have a normal dispatch, we follow all the normal rules and limits. + DispatchClass::Normal => { + let normal_limit = Self::get_dispatch_limit_ratio(DispatchClass::Normal) * maximum_weight; + let extrinsic_weight = info.weight.checked_add(T::ExtrinsicBaseWeight::get()) + .ok_or(InvalidTransaction::ExhaustsResources)?; + all_weight.checked_add(extrinsic_weight, DispatchClass::Normal) + .map_err(|_| InvalidTransaction::ExhaustsResources)?; + if all_weight.get(DispatchClass::Normal) > normal_limit { + Err(InvalidTransaction::ExhaustsResources.into()) + } else { + Ok(all_weight) + } + }, + // If we have an operational dispatch, allow it if we have not used our full + // "operational space" (independent of existing fullness). + DispatchClass::Operational => { + let operational_limit = Self::get_dispatch_limit_ratio(DispatchClass::Operational) * maximum_weight; + let normal_limit = Self::get_dispatch_limit_ratio(DispatchClass::Normal) * maximum_weight; + let operational_space = operational_limit.saturating_sub(normal_limit); + + let extrinsic_weight = info.weight.checked_add(T::ExtrinsicBaseWeight::get()) + .ok_or(InvalidTransaction::ExhaustsResources)?; + all_weight.checked_add(extrinsic_weight, DispatchClass::Operational) + .map_err(|_| InvalidTransaction::ExhaustsResources)?; + + // If it would fit in normally, its okay + if all_weight.total() <= maximum_weight || + // If we have not used our operational space + all_weight.get(DispatchClass::Operational) <= operational_space { + Ok(all_weight) + } else { + Err(InvalidTransaction::ExhaustsResources.into()) + } } } } @@ -1452,8 +1531,8 @@ impl SignedExtension for CheckWeight where let unspent = post_info.calc_unspent(info); if unspent > 0 { - AllExtrinsicsWeight::mutate(|weight| { - *weight = weight.map(|w| w.saturating_sub(unspent)); + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.sub(unspent, info.class); }) } @@ -1713,7 +1792,7 @@ pub(crate) mod tests { use sp_std::cell::RefCell; use sp_core::H256; use sp_runtime::{traits::{BlakeTwo256, IdentityLookup, SignedExtension}, testing::Header, DispatchError}; - use frame_support::{impl_outer_origin, parameter_types, assert_ok}; + use frame_support::{impl_outer_origin, parameter_types, assert_ok, assert_noop}; impl_outer_origin! { pub enum Origin for Test where system = super {} @@ -1810,7 +1889,7 @@ pub(crate) mod tests { fn new_test_ext() -> sp_io::TestExternalities { let mut ext: sp_io::TestExternalities = GenesisConfig::default().build_storage::().unwrap().into(); // Add to each test the initial weight of a block - ext.execute_with(|| System::register_extra_weight_unchecked(::BlockExecutionWeight::get())); + ext.execute_with(|| System::register_extra_weight_unchecked(::BlockExecutionWeight::get(), DispatchClass::Mandatory)); ext } @@ -2036,7 +2115,9 @@ pub(crate) mod tests { let len = 0_usize; let reset_check_weight = |i, f, s| { - AllExtrinsicsWeight::put(s); + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.put(s, DispatchClass::Normal) + }); let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, i, len); if f { assert!(r.is_err()) } else { assert!(r.is_ok()) } }; @@ -2056,17 +2137,19 @@ pub(crate) mod tests { let len = 0_usize; // We allow 75% for normal transaction, so we put 25% - extrinsic base weight - AllExtrinsicsWeight::put(256 - ::ExtrinsicBaseWeight::get()); + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.put(256 - ::ExtrinsicBaseWeight::get(), DispatchClass::Normal) + }); let pre = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &info, len).unwrap(); - assert_eq!(AllExtrinsicsWeight::get().unwrap(), info.weight + 256); + assert_eq!(AllExtrinsicsWeight::get().total(), info.weight + 256); assert!( CheckWeight::::post_dispatch(pre, &info, &post_info, len, &Ok(())) .is_ok() ); assert_eq!( - AllExtrinsicsWeight::get().unwrap(), + AllExtrinsicsWeight::get().total(), post_info.actual_weight.unwrap() + 256, ); }) @@ -2079,11 +2162,13 @@ pub(crate) mod tests { let post_info = PostDispatchInfo { actual_weight: Some(700), }; let len = 0_usize; - AllExtrinsicsWeight::put(128); + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.put(128, DispatchClass::Normal) + }); let pre = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &info, len).unwrap(); assert_eq!( - AllExtrinsicsWeight::get().unwrap(), + AllExtrinsicsWeight::get().total(), info.weight + 128 + ::ExtrinsicBaseWeight::get(), ); @@ -2092,7 +2177,7 @@ pub(crate) mod tests { .is_ok() ); assert_eq!( - AllExtrinsicsWeight::get().unwrap(), + AllExtrinsicsWeight::get().total(), info.weight + 128 + ::ExtrinsicBaseWeight::get(), ); }) @@ -2105,11 +2190,11 @@ pub(crate) mod tests { let len = 0_usize; // Initial weight from `BlockExecutionWeight` - assert_eq!(System::all_extrinsics_weight(), ::BlockExecutionWeight::get()); + assert_eq!(System::all_extrinsics_weight().total(), ::BlockExecutionWeight::get()); let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &free, len); assert!(r.is_ok()); assert_eq!( - System::all_extrinsics_weight(), + System::all_extrinsics_weight().total(), ::ExtrinsicBaseWeight::get() + ::BlockExecutionWeight::get() ); }) @@ -2126,17 +2211,17 @@ pub(crate) mod tests { let len = 0_usize; assert_ok!(CheckWeight::::do_pre_dispatch(&max, len)); - assert_eq!(System::all_extrinsics_weight(), Weight::max_value()); - assert!(System::all_extrinsics_weight() > ::MaximumBlockWeight::get()); + assert_eq!(System::all_extrinsics_weight().total(), Weight::max_value()); + assert!(System::all_extrinsics_weight().total() > ::MaximumBlockWeight::get()); }); } #[test] fn register_extra_weight_unchecked_doesnt_care_about_limits() { new_test_ext().execute_with(|| { - System::register_extra_weight_unchecked(Weight::max_value()); - assert_eq!(System::all_extrinsics_weight(), Weight::max_value()); - assert!(System::all_extrinsics_weight() > ::MaximumBlockWeight::get()); + System::register_extra_weight_unchecked(Weight::max_value(), DispatchClass::Normal); + assert_eq!(System::all_extrinsics_weight().total(), Weight::max_value()); + assert!(System::all_extrinsics_weight().total() > ::MaximumBlockWeight::get()); }); } @@ -2154,10 +2239,45 @@ pub(crate) mod tests { let len = 0_usize; assert_ok!(CheckWeight::::do_pre_dispatch(&max_normal, len)); - assert_eq!(System::all_extrinsics_weight(), 768); + assert_eq!(System::all_extrinsics_weight().total(), 768); assert_ok!(CheckWeight::::do_pre_dispatch(&rest_operational, len)); assert_eq!(::MaximumBlockWeight::get(), 1024); - assert_eq!(System::all_extrinsics_weight(), ::MaximumBlockWeight::get()); + assert_eq!(System::all_extrinsics_weight().total(), ::MaximumBlockWeight::get()); + }); + } + + #[test] + fn dispatch_order_does_not_effect_weight_logic() { + new_test_ext().execute_with(|| { + // We switch the order of `full_block_with_normal_and_operational` + let max_normal = DispatchInfo { weight: 753, ..Default::default() }; + let rest_operational = DispatchInfo { weight: 251, class: DispatchClass::Operational, ..Default::default() }; + + let len = 0_usize; + + assert_ok!(CheckWeight::::do_pre_dispatch(&rest_operational, len)); + // Extra 15 here from block execution + base extrinsic weight + assert_eq!(System::all_extrinsics_weight().total(), 266); + assert_ok!(CheckWeight::::do_pre_dispatch(&max_normal, len)); + assert_eq!(::MaximumBlockWeight::get(), 1024); + assert_eq!(System::all_extrinsics_weight().total(), ::MaximumBlockWeight::get()); + }); + } + + #[test] + fn operational_works_on_full_block() { + new_test_ext().execute_with(|| { + // An on_initialize takes up the whole block! (Every time!) + System::register_extra_weight_unchecked(Weight::max_value(), DispatchClass::Mandatory); + let dispatch_normal = DispatchInfo { weight: 251, class: DispatchClass::Normal, ..Default::default() }; + let dispatch_operational = DispatchInfo { weight: 251, class: DispatchClass::Operational, ..Default::default() }; + let len = 0_usize; + + assert_noop!(CheckWeight::::do_pre_dispatch(&dispatch_normal, len), InvalidTransaction::ExhaustsResources); + // Thank goodness we can still do an operational transaction to possibly save the blockchain. + assert_ok!(CheckWeight::::do_pre_dispatch(&dispatch_operational, len)); + // Not too much though + assert_noop!(CheckWeight::::do_pre_dispatch(&dispatch_operational, len), InvalidTransaction::ExhaustsResources); }); } @@ -2170,7 +2290,9 @@ pub(crate) mod tests { let normal_limit = normal_weight_limit(); // given almost full block - AllExtrinsicsWeight::put(normal_limit); + AllExtrinsicsWeight::mutate(|current_weight| { + current_weight.put(normal_limit, DispatchClass::Normal) + }); // will not fit. assert!(CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &normal, len).is_err()); // will fit. -- GitLab From 64d603a13c3defb8c9d26e994f0eae2ff2f927bf Mon Sep 17 00:00:00 2001 From: Max Inden Date: Tue, 12 May 2020 12:48:28 +0200 Subject: [PATCH 018/150] client/finality-granpda/until_imported: Rework pinning (#5983) An `UntilImported` stream wraps a `Stream` of incoming messages and waits for blocks those messages are based on before passing the messages on. The above `Stream` of incoming messages implements `Unpin`, thus there is no need to use `pin_project` on the `UntilImported` struct. Instead one only has to add the `Unpin` trait bound on the `I` trait parameter. --- client/finality-grandpa/src/until_imported.rs | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index 737c8c6a77..6f76ce3fa8 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -31,7 +31,7 @@ use super::{ use log::{debug, warn}; use sp_utils::mpsc::TracingUnboundedReceiver; use futures::prelude::*; -use futures::stream::Fuse; +use futures::stream::{Fuse, StreamExt}; use futures_timer::Delay; use finality_grandpa::voter; use parking_lot::Mutex; @@ -137,14 +137,16 @@ impl Drop for Metrics { } } -/// Buffering imported messages until blocks with given hashes are imported. -#[pin_project::pin_project] -pub(crate) struct UntilImported> { +/// Buffering incoming messages until blocks with given hashes are imported. +pub(crate) struct UntilImported where + Block: BlockT, + I: Stream + Unpin, + M: BlockUntilImported, +{ import_notifications: Fuse>>, block_sync_requester: BlockSyncRequester, status_check: BlockStatus, - #[pin] - inner: Fuse, + incoming_messages: Fuse, ready: VecDeque, /// Interval at which to check status of each awaited block. check_pending: Pin> + Send + Sync>>, @@ -159,11 +161,17 @@ pub(crate) struct UntilImported, } +impl Unpin for UntilImported where + Block: BlockT, + I: Stream + Unpin, + M: BlockUntilImported, +{} + impl UntilImported where Block: BlockT, BlockStatus: BlockStatusT, BlockSyncRequester: BlockSyncRequesterT, - I: Stream, + I: Stream + Unpin, M: BlockUntilImported, { /// Create a new `UntilImported` wrapper. @@ -171,7 +179,7 @@ impl UntilImported, block_sync_requester: BlockSyncRequester, status_check: BlockStatus, - stream: I, + incoming_messages: I, identifier: &'static str, metrics: Option, ) -> Self { @@ -192,7 +200,7 @@ impl UntilImported Stream for UntilImported, BSyncRequester: BlockSyncRequesterT, - I: Stream, + I: Stream + Unpin, M: BlockUntilImported, { type Item = Result; - fn poll_next(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { - // We are using a `this` variable in order to allow multiple simultaneous mutable borrow - // to `self`. - let mut this = self.project(); + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll> { + // We are using a `this` variable in order to allow multiple simultaneous mutable borrow to + // `self`. + let this = &mut *self; loop { - match Stream::poll_next(Pin::new(&mut this.inner), cx) { + match StreamExt::poll_next_unpin(&mut this.incoming_messages, cx) { Poll::Ready(None) => return Poll::Ready(None), Poll::Ready(Some(input)) => { // new input: schedule wait of any parts which require // blocks to be known. - match M::needs_waiting(input, this.status_check)? { + match M::needs_waiting(input, &this.status_check)? { DiscardWaitOrReady::Discard => {}, DiscardWaitOrReady::Wait(items) => { for (target_hash, target_number, wait) in items { @@ -245,7 +253,7 @@ impl Stream for UntilImported return Poll::Ready(None), Poll::Ready(Some(notification)) => { // new block imported. queue up all messages tied to that hash. @@ -315,7 +323,7 @@ impl Stream for UntilImported Date: Tue, 12 May 2020 12:16:46 +0100 Subject: [PATCH 019/150] grandpa: update to finality-grandpa v0.12.3 (#5972) --- Cargo.lock | 4 ++-- client/finality-grandpa/Cargo.toml | 4 ++-- client/finality-grandpa/rpc/Cargo.toml | 2 +- frame/grandpa/Cargo.toml | 2 +- primitives/finality-grandpa/Cargo.toml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42e0ed9db7..9303038972 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1352,9 +1352,9 @@ dependencies = [ [[package]] name = "finality-grandpa" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4682570188cd105606e621b9992e580f717c15f8cd1b7d106b59f1c6e54680" +checksum = "8feb87a63249689640ac9c011742c33139204e3c134293d3054022276869133b" dependencies = [ "either", "futures 0.3.4", diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 9b5d787f88..675e571c65 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -42,11 +42,11 @@ sp-finality-tracker = { version = "2.0.0-dev", path = "../../primitives/finality sp-finality-grandpa = { version = "2.0.0-dev", path = "../../primitives/finality-grandpa" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } -finality-grandpa = { version = "0.12.2", features = ["derive-codec"] } +finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } pin-project = "0.4.6" [dev-dependencies] -finality-grandpa = { version = "0.12.2", features = ["derive-codec", "test-helpers"] } +finality-grandpa = { version = "0.12.3", features = ["derive-codec", "test-helpers"] } sc-network = { version = "0.8.0-dev", path = "../network" } sc-network-test = { version = "0.8.0-dev", path = "../network/test" } sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } diff --git a/client/finality-grandpa/rpc/Cargo.toml b/client/finality-grandpa/rpc/Cargo.toml index 175a4ccfe8..9435b6142b 100644 --- a/client/finality-grandpa/rpc/Cargo.toml +++ b/client/finality-grandpa/rpc/Cargo.toml @@ -9,7 +9,7 @@ license = "GPL-3.0" [dependencies] sc-finality-grandpa = { version = "0.8.0-dev", path = "../" } -finality-grandpa = { version = "0.12.2", features = ["derive-codec"] } +finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.3" jsonrpc-derive = "14.0.3" diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index 649b4053d0..04547acaf1 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -27,7 +27,7 @@ pallet-session = { version = "2.0.0-dev", default-features = false, path = "../s pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../finality-tracker" } [dev-dependencies] -grandpa = { package = "finality-grandpa", version = "0.12.2", features = ["derive-codec"] } +grandpa = { package = "finality-grandpa", version = "0.12.3", features = ["derive-codec"] } sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } pallet-balances = { version = "2.0.0-dev", path = "../balances" } diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index 378f715ecc..3f0d3f0d14 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -grandpa = { package = "finality-grandpa", version = "0.12.2", default-features = false, features = ["derive-codec"] } +grandpa = { package = "finality-grandpa", version = "0.12.3", default-features = false, features = ["derive-codec"] } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -- GitLab From b85fc50a814fbd9d84409b2afe6fb4433235fdcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Tue, 12 May 2020 12:17:33 +0100 Subject: [PATCH 020/150] grandpa: missing equivocation reporting nits (#5953) * primitives: move reporting key type to common key types * session: remove useless methods on MembershipProof * grandpa: remove std special-casing when checking signatures * grandpa: add some more docs * grandpa: use proper error types rather than strings --- bin/node/primitives/src/lib.rs | 4 ++-- frame/grandpa/src/equivocation.rs | 10 ++++++++-- frame/grandpa/src/lib.rs | 24 +++++++++++++----------- primitives/core/src/crypto.rs | 2 ++ primitives/finality-grandpa/src/lib.rs | 21 +++++++-------------- primitives/session/src/lib.rs | 12 ------------ 6 files changed, 32 insertions(+), 41 deletions(-) diff --git a/bin/node/primitives/src/lib.rs b/bin/node/primitives/src/lib.rs index c6180b31f7..6e02e68add 100644 --- a/bin/node/primitives/src/lib.rs +++ b/bin/node/primitives/src/lib.rs @@ -69,11 +69,11 @@ pub type BlockId = generic::BlockId; pub mod report { use super::{Signature, Verify}; use frame_system::offchain::AppCrypto; - use sp_core::crypto::KeyTypeId; + use sp_core::crypto::{key_types, KeyTypeId}; /// Key type for the reporting module. Used for reporting BABE and GRANDPA /// equivocations. - pub const KEY_TYPE: KeyTypeId = KeyTypeId(*b"fish"); + pub const KEY_TYPE: KeyTypeId = key_types::REPORTING; mod app { use sp_application_crypto::{app_crypto, sr25519}; diff --git a/frame/grandpa/src/equivocation.rs b/frame/grandpa/src/equivocation.rs index f9ae430216..2a8c3e5722 100644 --- a/frame/grandpa/src/equivocation.rs +++ b/frame/grandpa/src/equivocation.rs @@ -29,6 +29,12 @@ //! And in a runtime context, so that the GRANDPA module can validate the //! equivocation proofs in the extrinsic and report the offences. //! +//! IMPORTANT: +//! When using this module for enabling equivocation reporting it is required +//! that the `ValidateEquivocationReport` signed extension is used in the runtime +//! definition. Failure to do so will allow invalid equivocation reports to be +//! accepted by the runtime. +//! use sp_std::prelude::*; @@ -395,12 +401,12 @@ impl GetValidatorCount for frame_support::Void { impl GetSessionNumber for sp_session::MembershipProof { fn session(&self) -> SessionIndex { - self.session() + self.session } } impl GetValidatorCount for sp_session::MembershipProof { fn validator_count(&self) -> sp_session::ValidatorCount { - self.validator_count() + self.validator_count } } diff --git a/frame/grandpa/src/lib.rs b/frame/grandpa/src/lib.rs index 16aebe335f..055607816d 100644 --- a/frame/grandpa/src/lib.rs +++ b/frame/grandpa/src/lib.rs @@ -184,6 +184,10 @@ decl_error! { ChangePending, /// Cannot signal forced change so soon after last. TooSoon, + /// A key ownership proof provided as part of an equivocation report is invalid. + InvalidKeyOwnershipProof, + /// A given equivocation report is valid but already previously reported. + DuplicateOffenceReport, } } @@ -228,8 +232,9 @@ decl_module! { /// against the extracted offender. If both are valid, the offence /// will be reported. /// - /// Since the weight is 0 in order to avoid DoS pre-validation is implemented in a - /// `SignedExtension`. + /// Since the weight of the extrinsic is 0, in order to avoid DoS by + /// submission of invalid equivocation reports, a mandatory pre-validation of + /// the extrinsic is implemented in a `SignedExtension`. #[weight = 0] fn report_equivocation( origin, @@ -249,7 +254,7 @@ decl_module! { T::KeyOwnerProofSystem::check_proof( (fg_primitives::KEY_TYPE, equivocation_proof.offender().clone()), key_owner_proof, - ).ok_or("Invalid key ownership proof.")?; + ).ok_or(Error::::InvalidKeyOwnershipProof)?; // the set id and round when the offence happened let set_id = equivocation_proof.set_id(); @@ -265,7 +270,7 @@ decl_module! { set_id, round, ), - ).map_err(|_| "Duplicate offence report.")?; + ).map_err(|_| Error::::DuplicateOffenceReport)?; } fn on_finalize(block_number: T::BlockNumber) { @@ -440,9 +445,9 @@ impl Module { Self::set_grandpa_authorities(authorities); } - // NOTE: initialize first session of first set. this is necessary - // because we only update this `on_new_session` which isn't called - // for the genesis session. + // NOTE: initialize first session of first set. this is necessary for + // the genesis set and session since we only update the set -> session + // mapping whenever a new session starts, i.e. through `on_new_session`. SetIdSession::insert(0, 0); } @@ -454,10 +459,7 @@ impl Module { equivocation_proof: EquivocationProof, key_owner_proof: T::KeyOwnerProof, ) -> Option<()> { - T::HandleEquivocation::submit_equivocation_report(equivocation_proof, key_owner_proof) - .ok()?; - - Some(()) + T::HandleEquivocation::submit_equivocation_report(equivocation_proof, key_owner_proof).ok() } } diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index 44d43c3a44..f725e94a42 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -1006,6 +1006,8 @@ pub mod key_types { pub const AUTHORITY_DISCOVERY: KeyTypeId = KeyTypeId(*b"audi"); /// Key type for staking, built-in. Identified as `stak`. pub const STAKING: KeyTypeId = KeyTypeId(*b"stak"); + /// Key type for equivocation reporting, built-in. Identified as `fish`. + pub const REPORTING: KeyTypeId = KeyTypeId(*b"fish"); /// A key type ID useful for tests. pub const DUMMY: KeyTypeId = KeyTypeId(*b"dumy"); } diff --git a/primitives/finality-grandpa/src/lib.rs b/primitives/finality-grandpa/src/lib.rs index a84ce57c8d..7cc8ddf5cc 100644 --- a/primitives/finality-grandpa/src/lib.rs +++ b/primitives/finality-grandpa/src/lib.rs @@ -352,21 +352,11 @@ where H: Encode, N: Encode, { - localized_payload_with_buffer(round, set_id, message, buf); - - #[cfg(not(feature = "std"))] - let verify = || { - use sp_application_crypto::RuntimeAppPublic; - id.verify(&buf, signature) - }; + use sp_application_crypto::RuntimeAppPublic; - #[cfg(feature = "std")] - let verify = || { - use sp_application_crypto::Pair; - AuthorityPair::verify(signature, &buf, &id) - }; + localized_payload_with_buffer(round, set_id, message, buf); - if verify() { + if id.verify(&buf, signature) { Ok(()) } else { #[cfg(feature = "std")] @@ -501,7 +491,10 @@ sp_api::decl_runtime_apis! { /// provide the equivocation proof and a key ownership proof (should be /// obtained using `generate_key_ownership_proof`). This method will /// sign the extrinsic with any reporting keys available in the keystore - /// and will push the transaction to the pool. + /// and will push the transaction to the pool. This method returns `None` + /// when creation of the extrinsic fails, either due to unavailability + /// of keys to sign, or because equivocation reporting is disabled for + /// the given runtime (i.e. this method is hardcoded to return `None`). /// Only useful in an offchain context. fn submit_report_equivocation_extrinsic( equivocation_proof: EquivocationProof>, diff --git a/primitives/session/src/lib.rs b/primitives/session/src/lib.rs index 720dfbfcad..74b4a250e6 100644 --- a/primitives/session/src/lib.rs +++ b/primitives/session/src/lib.rs @@ -63,18 +63,6 @@ pub struct MembershipProof { pub validator_count: ValidatorCount, } -impl MembershipProof { - /// Returns a session this proof was generated for. - pub fn session(&self) -> SessionIndex { - self.session - } - - /// Returns the validator count of the session this proof was generated for. - pub fn validator_count(&self) -> ValidatorCount { - self.validator_count - } -} - /// Generate the initial session keys with the given seeds, at the given block and store them in /// the client's keystore. #[cfg(feature = "std")] -- GitLab From 9d09d37bedfc98d0a45604f2d2e736130cee15ce Mon Sep 17 00:00:00 2001 From: Ashley Date: Tue, 12 May 2020 15:16:07 +0200 Subject: [PATCH 021/150] Update and pin node-browser-testing wasm-bindgen version (#5987) --- Cargo.lock | 20 ++++++++++---------- bin/node/browser-testing/Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9303038972..cae4d7c8f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9213,9 +9213,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" -version = "0.2.60" +version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc57ce05287f8376e998cbddfb4c8cb43b84a7ec55cf4551d7c00eef317a47f" +checksum = "e3c7d40d09cdbf0f4895ae58cf57d92e1e57a9dd8ed2e8390514b54a47cc5551" dependencies = [ "cfg-if", "serde", @@ -9225,9 +9225,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.60" +version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967d37bf6c16cca2973ca3af071d0a2523392e4a594548155d89a678f4237cd" +checksum = "c3972e137ebf830900db522d6c8fd74d1900dcfc733462e9a12e942b00b4ac94" dependencies = [ "bumpalo", "lazy_static", @@ -9252,9 +9252,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.60" +version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd151b63e1ea881bb742cd20e1d6127cef28399558f3b5d415289bc41eee3a4" +checksum = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" dependencies = [ "quote 1.0.3", "wasm-bindgen-macro-support", @@ -9262,9 +9262,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.60" +version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68a5b36eef1be7868f668632863292e37739656a80fc4b9acec7b0bd35a4931" +checksum = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -9275,9 +9275,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.60" +version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf76fe7d25ac79748a37538b7daeed1c7a6867c92d3245c12c6222e4a20d639" +checksum = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" [[package]] name = "wasm-bindgen-test" diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 391f2fa226..0f2a4751a8 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -12,7 +12,7 @@ libp2p = { version = "0.18.0", default-features = false } jsonrpc-core = "14.0.5" serde = "1.0.106" serde_json = "1.0.48" -wasm-bindgen = { version = "0.2.60", features = ["serde-serialize"] } +wasm-bindgen = { version = "=0.2.62", features = ["serde-serialize"] } wasm-bindgen-futures = "0.4.10" wasm-bindgen-test = "0.3.10" futures = "0.3.4" -- GitLab From d2b38b6880e4d5f5689cca3961adfa19c1a18d60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Tue, 12 May 2020 14:18:15 +0100 Subject: [PATCH 022/150] babe: minor rpc nits (#5974) * babe: fix formatting * babe: re-use same epoch data in epoch_authorship rpc method --- client/consensus/babe/rpc/src/lib.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index aa7e1c0e1e..44273a2859 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -118,15 +118,18 @@ impl BabeApi for BabeRPCHandler let key_pairs = { let keystore = keystore.read(); - epoch.authorities.iter().enumerate() - .flat_map(|(i, a)| { - keystore.key_pair::(&a.0).ok().map(|kp| (kp, i)) - }) - .collect::>() + epoch.authorities.iter() + .enumerate() + .flat_map(|(i, a)| { + keystore + .key_pair::(&a.0) + .ok() + .map(|kp| (kp, i)) + }) + .collect::>() }; for slot_number in epoch_start..epoch_end { - let epoch = epoch_data(&shared_epoch, &client, &babe_config, slot_number, &select_chain)?; if let Some((claim, key)) = authorship::claim_slot_using_key_pairs(slot_number, &epoch, &key_pairs) { -- GitLab From ba00ef1abd96f392219ea0c65e43953ca4b60525 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 12 May 2020 16:46:05 +0300 Subject: [PATCH 023/150] get tx_hashes from watcher (#5981) --- client/transaction-pool/graph/src/listener.rs | 9 +++++---- client/transaction-pool/graph/src/validated_pool.rs | 10 +--------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/client/transaction-pool/graph/src/listener.rs b/client/transaction-pool/graph/src/listener.rs index 92ba71007e..602c75e099 100644 --- a/client/transaction-pool/graph/src/listener.rs +++ b/client/transaction-pool/graph/src/listener.rs @@ -129,10 +129,11 @@ impl Listener { } /// Notify all watchers that transactions have been finalized - pub fn finalized(&mut self, block_hash: BlockHash, txs: Vec) { - self.finality_watchers.remove(&block_hash); - for h in txs { - self.fire(&h, |s| s.finalized(block_hash.clone())) + pub fn finalized(&mut self, block_hash: BlockHash) { + if let Some(hashes) = self.finality_watchers.remove(&block_hash) { + for hash in hashes { + self.fire(&hash, |s| s.finalized(block_hash)) + } } } } diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 2ff2acfe24..19f491bb1d 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -559,15 +559,7 @@ impl ValidatedPool { /// Notify all watchers that transactions in the block with hash have been finalized pub async fn on_block_finalized(&self, block_hash: BlockHash) -> Result<(), B::Error> { debug!(target: "txpool", "Attempting to notify watchers of finalization for {}", block_hash); - // fetch all extrinsic hashes - if let Some(txs) = self.api.block_body(&BlockId::Hash(block_hash.clone())).await? { - let tx_hashes = txs.into_iter() - .map(|tx| self.api.hash_and_length(&tx).0) - .collect::>(); - // notify the watcher that these extrinsics have been finalized - self.listener.write().finalized(block_hash, tx_hashes); - } - + self.listener.write().finalized(block_hash); Ok(()) } -- GitLab From 4e8e1b7dde07455a586d7b0fa316c5918416aeb2 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 12 May 2020 17:08:05 +0200 Subject: [PATCH 024/150] Restore the reputation penalty for timeouts (#5984) --- client/network/src/behaviour.rs | 2 +- client/network/src/protocol.rs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 5a5dd83803..656743ef7f 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -329,7 +329,7 @@ impl NetworkBehaviourEventProcess Protocol { } } + /// Must be called in response to a [`CustomMessageOutcome::BlockRequest`] if it has failed. + pub fn on_block_request_failed( + &mut self, + peer: &PeerId, + ) { + self.peerset_handle.report_peer(peer.clone(), rep::TIMEOUT); + self.behaviour.disconnect_peer(peer); + } + /// Perform time based maintenance. /// /// > **Note**: This method normally doesn't have to be called except for testing purposes. @@ -1874,10 +1883,11 @@ pub enum CustomMessageOutcome { /// Messages have been received on one or more notifications protocols. NotificationsReceived { remote: PeerId, messages: Vec<(ConsensusEngineId, Bytes)> }, /// A new block request must be emitted. - /// Once you have the response, you must call `Protocol::on_block_response`. + /// You must later call either [`Protocol::on_block_response`] or + /// [`Protocol::on_block_request_failed`]. + /// Each peer can only have one active request. If a request already exists for this peer, it + /// must be silently discarded. /// It is the responsibility of the handler to ensure that a timeout exists. - /// If the request times out, or the peer responds in an invalid way, the peer has to be - /// disconnect. This will inform the state machine that the request it has emitted is stale. BlockRequest { target: PeerId, request: message::BlockRequest }, /// A new finality proof request must be emitted. /// Once you have the response, you must call `Protocol::on_finality_proof_response`. -- GitLab From f3315cd08963f9c355fdf692526b1fe6ff5ff712 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 12 May 2020 17:12:32 +0200 Subject: [PATCH 025/150] Spawn the network worker with spawn_blocking (#5909) * Spawn the network worker with spawn_blocking * Some comment adjustments * Fix shutdown not working --- client/cli/src/runner.rs | 14 +++++++++----- client/service/src/builder.rs | 9 ++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/client/cli/src/runner.rs b/client/cli/src/runner.rs index 10e98906bf..277d5f97b8 100644 --- a/client/cli/src/runner.rs +++ b/client/cli/src/runner.rs @@ -217,12 +217,16 @@ impl Runner { // and drop the runtime first. let _telemetry = service.telemetry(); - let f = service.fuse(); - pin_mut!(f); + { + let f = service.fuse(); + self.tokio_runtime + .block_on(main(f)) + .map_err(|e| e.to_string())?; + } - self.tokio_runtime - .block_on(main(f)) - .map_err(|e| e.to_string())?; + // The `service` **must** have been destroyed here for the shutdown signal to propagate + // to all the tasks. Dropping `tokio_runtime` will block the thread until all tasks have + // shut down. drop(self.tokio_runtime); Ok(()) diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index eb6e040cc4..b172681094 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -1161,7 +1161,14 @@ ServiceBuilder< // This is used internally, so don't restrict access to unsafe RPC let rpc_handlers = gen_handler(sc_rpc::DenyUnsafe::No); - spawn_handle.spawn( + // The network worker is responsible for gathering all network messages and processing + // them. This is quite a heavy task, and at the time of the writing of this comment it + // frequently happens that this future takes several seconds or in some situations + // even more than a minute until it has processed its entire queue. This is clearly an + // issue, and ideally we would like to fix the network future to take as little time as + // possible, but we also take the extra harm-prevention measure to execute the networking + // future using `spawn_blocking`. + spawn_handle.spawn_blocking( "network-worker", build_network_future( config.role.clone(), -- GitLab From 1d0b92c34d80201807c19da79ffd2c737ebbaed1 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Tue, 12 May 2020 19:07:36 +0200 Subject: [PATCH 026/150] client/network: Remove default Kademlia DHT in favor of per protocol DHT (#5993) Substrate was previously running both a chain specific Kademlia DHT as well as the `/ipfs/kad/1.0.0` Kademlia DHT for backwards compatibility. (See 710722f for details.) With the end of the transition period this commit removes the former only leaving the latter and thus preventing the discovery of incompatible nodes via Kademlia. --- client/network/src/discovery.rs | 30 +++++++++++++++--------------- client/network/src/lib.rs | 10 ++++++---- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 56c08cc56c..f5252e2695 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -26,12 +26,12 @@ //! //! - mDNS. Discovers nodes on the local network by broadcasting UDP packets. //! -//! - Kademlia random walk. Once connected, we perform random Kademlia `FIND_NODE` requests in -//! order for nodes to propagate to us their view of the network. This is performed automatically -//! by the `DiscoveryBehaviour`. +//! - Kademlia random walk. Once connected, we perform random Kademlia `FIND_NODE` requests on the +//! configured Kademlia DHTs in order for nodes to propagate to us their view of the network. This +//! is performed automatically by the `DiscoveryBehaviour`. //! //! Additionally, the `DiscoveryBehaviour` is also capable of storing and loading value in the -//! network-wide DHT. +//! configured DHTs. //! //! ## Usage //! @@ -68,6 +68,9 @@ use std::task::{Context, Poll}; use sp_core::hexdisplay::HexDisplay; /// `DiscoveryBehaviour` configuration. +/// +/// Note: In order to discover nodes or load and store values via Kademlia one has to add at least +/// one protocol via [`DiscoveryConfig::add_protocol`]. pub struct DiscoveryConfig { local_peer_id: PeerId, user_defined: Vec<(PeerId, Multiaddr)>, @@ -81,7 +84,7 @@ pub struct DiscoveryConfig { impl DiscoveryConfig { /// Create a default configuration with the given public key. pub fn new(local_public_key: PublicKey) -> Self { - let mut this = DiscoveryConfig { + DiscoveryConfig { local_peer_id: local_public_key.into_peer_id(), user_defined: Vec::new(), allow_private_ipv4: true, @@ -89,15 +92,7 @@ impl DiscoveryConfig { discovery_only_if_under_num: std::u64::MAX, enable_mdns: false, kademlias: HashMap::new() - }; - - // Temporary hack to retain backwards compatibility. - // We should eventually remove the special handling of DEFAULT_PROTO_NAME. - let proto_id = ProtocolId::from(libp2p::kad::protocol::DEFAULT_PROTO_NAME); - let proto_name = Vec::from(proto_id.as_bytes()); - this.add_kademlia(proto_id, proto_name); - - this + } } /// Set the number of active connections at which we pause discovery. @@ -706,6 +701,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { #[cfg(test)] mod tests { + use crate::config::ProtocolId; use futures::prelude::*; use libp2p::identity::Keypair; use libp2p::Multiaddr; @@ -744,11 +740,15 @@ mod tests { }); let behaviour = { + let protocol_id: &[u8] = b"/test/kad/1.0.0"; + let mut config = DiscoveryConfig::new(keypair.public()); config.with_user_defined(user_defined.clone()) .allow_private_ipv4(true) .allow_non_globals_in_dht(true) - .discovery_limit(50); + .discovery_limit(50) + .add_protocol(ProtocolId::from(protocol_id)); + config.finish() }; diff --git a/client/network/src/lib.rs b/client/network/src/lib.rs index 1ed0b90540..dbc54d21c4 100644 --- a/client/network/src/lib.rs +++ b/client/network/src/lib.rs @@ -53,9 +53,10 @@ //! - mDNS. We perform a UDP broadcast on the local network. Nodes that listen may respond with //! their identity. More info [here](https://github.com/libp2p/specs/blob/master/discovery/mdns.md). //! mDNS can be disabled in the network configuration. -//! - Kademlia random walk. Once connected, we perform random Kademlia `FIND_NODE` requests in -//! order for nodes to propagate to us their view of the network. More information about Kademlia -//! can be found [on Wikipedia](https://en.wikipedia.org/wiki/Kademlia). +//! - Kademlia random walk. Once connected, we perform random Kademlia `FIND_NODE` requests on the +//! configured Kademlia DHTs (one per configured chain protocol) in order for nodes to propagate to +//! us their view of the network. More information about Kademlia can be found [on +//! Wikipedia](https://en.wikipedia.org/wiki/Kademlia). //! //! ## Connection establishment //! @@ -77,6 +78,7 @@ //! frames. Encryption and multiplexing are additionally negotiated again inside this channel. //! - DNS for addresses of the form `/dns4/example.com/tcp/5` or `/dns4/example.com/tcp/5/ws`. A //! node's address can contain a domain name. +//! - (All of the above using IPv6 instead of IPv4.) //! //! On top of the base-layer protocol, the [Noise](https://noiseprotocol.org/) protocol is //! negotiated and applied. The exact handshake protocol is experimental and is subject to change. @@ -109,7 +111,7 @@ //! to a disconnection. //! - **[`/ipfs/id/1.0.0`](https://github.com/libp2p/specs/tree/master/identify)**. We //! periodically open an ephemeral substream in order to ask information from the remote. -//! - **[`/ipfs/kad/1.0.0`](https://github.com/libp2p/specs/pull/108)**. We periodically open +//! - **[`//kad`](https://github.com/libp2p/specs/pull/108)**. We periodically open //! ephemeral substreams for Kademlia random walk queries. Each Kademlia query is done in a //! separate substream. //! -- GitLab From f5a15d17c49a334693d0c1c56626fe529c88fbfa Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 12 May 2020 19:22:41 +0200 Subject: [PATCH 027/150] Turn an error! into a debug! (#6000) --- client/network/src/protocol/generic_proto/behaviour.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 3ce98dc11e..9ec23d0547 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -810,7 +810,7 @@ impl GenericProto { }; if !incoming.alive { - error!(target: "sub-libp2p", "PSM => Reject({:?}, {:?}): Obsolete incoming, \ + debug!(target: "sub-libp2p", "PSM => Reject({:?}, {:?}): Obsolete incoming, \ ignoring", index, incoming.peer_id); return } -- GitLab From 7b519977fc38bd5a3938a8d9bebea7843e133d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Nguyen?= Date: Tue, 12 May 2020 21:58:27 +0200 Subject: [PATCH 028/150] Fix minor typos in im-online documentation (#5997) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix minor typos on im-online documentation * Update frame/im-online/src/lib.rs Co-authored-by: Bastian Köcher --- frame/im-online/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index e280a89054..7815db7072 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -264,7 +264,7 @@ decl_event!( HeartbeatReceived(AuthorityId), /// At the end of the session, no offence was committed. AllGood, - /// At the end of the session, at least once validator was found to be offline. + /// At the end of the session, at least one validator was found to be offline. SomeOffline(Vec), } ); -- GitLab From e097348a045824572d4eda8ff521fd746fe75a15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 12 May 2020 23:08:24 +0200 Subject: [PATCH 029/150] Only send last finalized block to telemetry (#6003) Instead of informing the telemetry about each block that is finalized, we only need to send the last finalized block. This removes log spam on initial sync. --- client/service/src/client/client.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/client/service/src/client/client.rs b/client/service/src/client/client.rs index bc992291bd..df64622d64 100644 --- a/client/service/src/client/client.rs +++ b/client/service/src/client/client.rs @@ -87,6 +87,7 @@ use super::{ block_rules::{BlockRules, LookupResult as BlockLookupResult}, }; use futures::channel::mpsc; +use rand::Rng; #[cfg(feature="test-helpers")] use { @@ -661,8 +662,6 @@ impl Client where if let Ok(ImportResult::Imported(ref aux)) = result { if aux.is_new_best { - use rand::Rng; - // don't send telemetry block import events during initial sync for every // block to avoid spamming the telemetry server, these events will be randomly // sent at a rate of 1/10. @@ -954,7 +953,7 @@ impl Client where // we'll send notifications spuriously in that case. const MAX_TO_NOTIFY: usize = 256; let enacted = route_from_finalized.enacted(); - let start = enacted.len() - ::std::cmp::min(enacted.len(), MAX_TO_NOTIFY); + let start = enacted.len() - std::cmp::min(enacted.len(), MAX_TO_NOTIFY); for finalized in &enacted[start..] { operation.notify_finalized.push(finalized.hash); } @@ -978,14 +977,27 @@ impl Client where return Ok(()); } - for finalized_hash in notify_finalized { - let header = self.header(&BlockId::Hash(finalized_hash))? - .expect("header already known to exist in DB because it is indicated in the tree route; qed"); + // We assume the list is sorted and only want to inform the + // telemetry once about the finalized block. + if let Some(last) = notify_finalized.last() { + let header = self.header(&BlockId::Hash(*last))? + .expect( + "Header already known to exist in DB because it is \ + indicated in the tree route; qed" + ); telemetry!(SUBSTRATE_INFO; "notify.finalized"; "height" => format!("{}", header.number()), - "best" => ?finalized_hash, + "best" => ?last, ); + } + + for finalized_hash in notify_finalized { + let header = self.header(&BlockId::Hash(finalized_hash))? + .expect( + "Header already known to exist in DB because it is \ + indicated in the tree route; qed" + ); let notification = FinalityNotification { header, -- GitLab From 9e7d8e625ad376dfc34919ec8cfd430d417cf42d Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Wed, 13 May 2020 10:46:39 +0200 Subject: [PATCH 030/150] Change BlockHashCount Parameter in Node/Node Template (#5990) * change BlockHashCount param * fix test and lock --- bin/node-template/runtime/src/lib.rs | 2 +- bin/node/executor/tests/submit_transaction.rs | 2 +- bin/node/runtime/src/lib.rs | 2 +- test-utils/runtime/src/lib.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 8261577586..7c3302d8ed 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -123,7 +123,7 @@ pub fn native_version() -> NativeVersion { } parameter_types! { - pub const BlockHashCount: BlockNumber = 250; + pub const BlockHashCount: BlockNumber = 2400; /// We allow for 2 seconds of compute with a 6 second average block time. pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); diff --git a/bin/node/executor/tests/submit_transaction.rs b/bin/node/executor/tests/submit_transaction.rs index 4c4e4b0855..b968159d32 100644 --- a/bin/node/executor/tests/submit_transaction.rs +++ b/bin/node/executor/tests/submit_transaction.rs @@ -233,7 +233,7 @@ fn submitted_transaction_should_be_valid() { priority: 1_410_710_000_000, requires: vec![], provides: vec![(address, 0).encode()], - longevity: 128, + longevity: 2048, propagate: true, }); }); diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index a67f4855ac..64b4cc0e64 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -124,7 +124,7 @@ impl OnUnbalanced for DealWithFees { } parameter_types! { - pub const BlockHashCount: BlockNumber = 250; + pub const BlockHashCount: BlockNumber = 2400; /// We allow for 2 seconds of compute with a 6 second average block time. pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 1003a0c593..c5c4a780f5 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -378,7 +378,7 @@ impl From> for Event { } parameter_types! { - pub const BlockHashCount: BlockNumber = 250; + pub const BlockHashCount: BlockNumber = 2400; pub const MinimumPeriod: u64 = 5; pub const MaximumBlockWeight: Weight = 4 * 1024 * 1024; pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { -- GitLab From fe67a0c41884bda918b55b658a041588a5014a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= Date: Wed, 13 May 2020 10:47:27 +0200 Subject: [PATCH 031/150] Fix gitlab line-width CI check (#5994) * Run script in strict mode * Add proper seperator between revision and file * Fix copy paste error * Do not repeat limit number in error text * Fix bad revision error * Do not mask pipe errors * Fix typo * Remove unnecessary ... syntax * Do not fetch all commits of master * Fetching one commit is enough --- .maintain/gitlab/check_line_width.sh | 32 +++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/.maintain/gitlab/check_line_width.sh b/.maintain/gitlab/check_line_width.sh index f382d630b1..85092260b6 100755 --- a/.maintain/gitlab/check_line_width.sh +++ b/.maintain/gitlab/check_line_width.sh @@ -2,47 +2,49 @@ # # check if line width of rust source files is not beyond x characters # +set -e +set -o pipefail +BASE_ORIGIN="origin" +BASE_BRANCH_NAME="master" +LINE_WIDTH="120" +GOOD_LINE_WIDTH="100" +BASE_BRANCH="${BASE_ORIGIN}/${BASE_BRANCH_NAME}" -BASE_BRANCH="origin/master" -LINE_WIDTH="121" -GOOD_LINE_WIDTH="101" - - -git diff --name-only ${BASE_BRANCH}...${CI_COMMIT_SHA} \*.rs | ( while read file +git fetch ${BASE_ORIGIN} ${BASE_BRANCH_NAME} --depth 1 +git diff --name-only ${BASE_BRANCH} -- \*.rs | ( while read file do if [ ! -f ${file} ]; then echo "Skipping removed file." - elif git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${LINE_WIDTH}\}" + elif git diff ${BASE_BRANCH} -- ${file} | grep -q "^+.\{$(( $LINE_WIDTH + 1 ))\}" then if [ -z "${FAIL}" ] then - echo "| warning!" - echo "| Lines should not be longer than 120 characters." + echo "| error!" + echo "| Lines must not be longer than ${LINE_WIDTH} characters." echo "| " echo "| see more https://wiki.parity.io/Substrate-Style-Guide" echo "|" FAIL="true" fi echo "| file: ${file}" - git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ - | grep -n "^+.\{${LINE_WIDTH}\}" + git diff ${BASE_BRANCH} -- ${file} \ + | grep -n "^+.\{$(( $LINE_WIDTH + 1))\}" echo "|" else - if git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} | grep -q "^+.\{${GOOD_LINE_WIDTH}\}" + if git diff ${BASE_BRANCH} -- ${file} | grep -q "^+.\{$(( $GOOD_LINE_WIDTH + 1 ))\}" then if [ -z "${FAIL}" ] then echo "| warning!" - echo "| Lines should be longer than 100 characters only in exceptional circumstances!" + echo "| Lines should be longer than ${GOOD_LINE_WIDTH} characters only in exceptional circumstances!" echo "| " echo "| see more https://wiki.parity.io/Substrate-Style-Guide" echo "|" fi echo "| file: ${file}" - git diff ${BASE_BRANCH}...${CI_COMMIT_SHA} ${file} \ - | grep -n "^+.\{${LINE_WIDTH}\}" + git diff ${BASE_BRANCH} -- ${file} | grep -n "^+.\{$(( $GOOD_LINE_WIDTH + 1 ))\}" echo "|" fi fi -- GitLab From 0a95ced9e873ccb4c0f7243250e8e49f11ae6ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=BBuk?= Date: Wed, 13 May 2020 12:02:14 +0200 Subject: [PATCH 032/150] Monitor transactions rejected from the pool as invalid (#5992) --- client/transaction-pool/src/lib.rs | 4 +++- client/transaction-pool/src/metrics.rs | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index e095191c57..12d3b3a30e 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -296,7 +296,9 @@ impl TransactionPool for BasicPool } fn remove_invalid(&self, hashes: &[TxHash]) -> Vec> { - self.pool.validated_pool().remove_invalid(hashes) + let removed = self.pool.validated_pool().remove_invalid(hashes); + self.metrics.report(|metrics| metrics.validations_invalid.inc_by(removed.len() as u64)); + removed } fn status(&self) -> PoolStatus { diff --git a/client/transaction-pool/src/metrics.rs b/client/transaction-pool/src/metrics.rs index 78e49b3ca5..74c41a1262 100644 --- a/client/transaction-pool/src/metrics.rs +++ b/client/transaction-pool/src/metrics.rs @@ -45,6 +45,7 @@ impl MetricsLink { pub struct Metrics { pub validations_scheduled: Counter, pub validations_finished: Counter, + pub validations_invalid: Counter, } impl Metrics { @@ -64,6 +65,13 @@ impl Metrics { )?, registry, )?, + validations_invalid: register( + Counter::new( + "sub_txpool_validations_invalid", + "Total number of transactions that were removed from the pool as invalid", + )?, + registry, + )?, }) } } -- GitLab From dbd558298f65c4ffbb6e12d8758a809a78021d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 13 May 2020 12:40:10 +0200 Subject: [PATCH 033/150] Give more meaningful error on missing feature when opening a db (#5999) --- client/db/src/utils.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index d40abcab66..b52126536f 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -210,6 +210,12 @@ pub fn open_database( config: &DatabaseSettings, db_type: DatabaseType, ) -> sp_blockchain::Result>> { + let db_open_error = |feat| Err( + sp_blockchain::Error::Backend( + format!("`{}` feature not enabled, database can not be opened", feat), + ), + ); + let db: Arc> = match &config.source { #[cfg(any(feature = "kvdb-rocksdb", test))] DatabaseSettingsSrc::RocksDb { path, cache_size } => { @@ -247,21 +253,29 @@ pub fn open_database( .map_err(|err| sp_blockchain::Error::Backend(format!("{}", err)))?; sp_database::as_database(db) }, + #[cfg(not(any(feature = "kvdb-rocksdb", test)))] + DatabaseSettingsSrc::RocksDb { .. } => { + return db_open_error("kvdb-rocksdb"); + }, #[cfg(feature = "subdb")] DatabaseSettingsSrc::SubDb { path } => { crate::subdb::open(&path, NUM_COLUMNS) .map_err(|e| sp_blockchain::Error::Backend(format!("{:?}", e)))? }, + #[cfg(not(feature = "subdb"))] + DatabaseSettingsSrc::SubDb { .. } => { + return db_open_error("subdb"); + }, #[cfg(feature = "parity-db")] DatabaseSettingsSrc::ParityDb { path } => { crate::parity_db::open(&path) .map_err(|e| sp_blockchain::Error::Backend(format!("{:?}", e)))? }, - DatabaseSettingsSrc::Custom(db) => db.clone(), - _ => { - let msg = "Trying to open a unsupported database".into(); - return Err(sp_blockchain::Error::Backend(msg)); + #[cfg(not(feature = "parity-db"))] + DatabaseSettingsSrc::ParityDb { .. } => { + return db_open_error("parity-db"); }, + DatabaseSettingsSrc::Custom(db) => db.clone(), }; check_database_type(&*db, db_type)?; -- GitLab From 3fd1405e4590e60cc674f021f11f1d56ddb02a67 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Wed, 13 May 2020 14:26:31 +0200 Subject: [PATCH 034/150] Add CRYPTO_ID to AppKey (#6011) --- primitives/application-crypto/src/lib.rs | 25 ++++++++++++--------- primitives/application-crypto/src/traits.rs | 2 ++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index b69b8b6877..36fd511ff4 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -54,11 +54,11 @@ pub use traits::*; #[macro_export] macro_rules! app_crypto { ($module:ident, $key_type:expr) => { - $crate::app_crypto_public_full_crypto!($module::Public, $key_type); + $crate::app_crypto_public_full_crypto!($module::Public, $key_type, $module::CRYPTO_ID); $crate::app_crypto_public_common!($module::Public, $module::Signature, $key_type, $module::CRYPTO_ID); - $crate::app_crypto_signature_full_crypto!($module::Signature, $key_type); + $crate::app_crypto_signature_full_crypto!($module::Signature, $key_type, $module::CRYPTO_ID); $crate::app_crypto_signature_common!($module::Signature, $key_type); - $crate::app_crypto_pair!($module::Pair, $key_type); + $crate::app_crypto_pair!($module::Pair, $key_type, $module::CRYPTO_ID); }; } @@ -75,9 +75,9 @@ macro_rules! app_crypto { #[macro_export] macro_rules! app_crypto { ($module:ident, $key_type:expr) => { - $crate::app_crypto_public_not_full_crypto!($module::Public, $key_type); + $crate::app_crypto_public_not_full_crypto!($module::Public, $key_type, $module::CRYPTO_ID); $crate::app_crypto_public_common!($module::Public, $module::Signature, $key_type, $module::CRYPTO_ID); - $crate::app_crypto_signature_not_full_crypto!($module::Signature, $key_type); + $crate::app_crypto_signature_not_full_crypto!($module::Signature, $key_type, $module::CRYPTO_ID); $crate::app_crypto_signature_common!($module::Signature, $key_type); }; } @@ -86,7 +86,7 @@ macro_rules! app_crypto { /// Application-specific type whose identifier is `$key_type`. #[macro_export] macro_rules! app_crypto_pair { - ($pair:ty, $key_type:expr) => { + ($pair:ty, $key_type:expr, $crypto_type:expr) => { $crate::wrap!{ /// A generic `AppPublic` wrapper type over $pair crypto; this has no specific App. #[derive(Clone)] @@ -141,6 +141,7 @@ macro_rules! app_crypto_pair { type Pair = Pair; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; + const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; } impl $crate::AppPair for Pair { @@ -183,7 +184,7 @@ macro_rules! app_crypto_pair_functions_if_std { #[doc(hidden)] #[macro_export] macro_rules! app_crypto_public_full_crypto { - ($public:ty, $key_type:expr) => { + ($public:ty, $key_type:expr, $crypto_type:expr) => { $crate::wrap!{ /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. #[derive( @@ -206,6 +207,7 @@ macro_rules! app_crypto_public_full_crypto { type Pair = Pair; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; + const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; } } } @@ -217,7 +219,7 @@ macro_rules! app_crypto_public_full_crypto { #[doc(hidden)] #[macro_export] macro_rules! app_crypto_public_not_full_crypto { - ($public:ty, $key_type:expr) => { + ($public:ty, $key_type:expr, $crypto_type:expr) => { $crate::wrap!{ /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. #[derive( @@ -236,6 +238,7 @@ macro_rules! app_crypto_public_not_full_crypto { type Public = Public; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; + const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; } } } @@ -357,7 +360,7 @@ macro_rules! app_crypto_public_common_if_std { #[doc(hidden)] #[macro_export] macro_rules! app_crypto_signature_full_crypto { - ($sig:ty, $key_type:expr) => { + ($sig:ty, $key_type:expr, $crypto_type:expr) => { $crate::wrap! { /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. #[derive(Clone, Default, Eq, PartialEq, @@ -379,6 +382,7 @@ macro_rules! app_crypto_signature_full_crypto { type Pair = Pair; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; + const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; } } } @@ -390,7 +394,7 @@ macro_rules! app_crypto_signature_full_crypto { #[doc(hidden)] #[macro_export] macro_rules! app_crypto_signature_not_full_crypto { - ($sig:ty, $key_type:expr) => { + ($sig:ty, $key_type:expr, $crypto_type:expr) => { $crate::wrap! { /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. #[derive(Clone, Default, Eq, PartialEq, @@ -408,6 +412,7 @@ macro_rules! app_crypto_signature_not_full_crypto { type Public = Public; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; + const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; } } } diff --git a/primitives/application-crypto/src/traits.rs b/primitives/application-crypto/src/traits.rs index 2983b143df..05ff03c2ce 100644 --- a/primitives/application-crypto/src/traits.rs +++ b/primitives/application-crypto/src/traits.rs @@ -38,6 +38,8 @@ pub trait AppKey: 'static + Send + Sync + Sized + CryptoType + Clone { /// An identifier for this application-specific key type. const ID: KeyTypeId; + /// The identifier of the crypto type of this application-specific key type. + const CRYPTO_ID: CryptoTypeId; } /// Type which implements Hash in std, not when no-std (std variant). -- GitLab From d2010259ff9c615322c1974c8714f68c1269f2de Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 13 May 2020 14:54:59 +0200 Subject: [PATCH 035/150] Add mitigation for the state inconsistency issue (#5996) * Add mitigation for the state inconsistency issue * Add logging --- .../src/protocol/generic_proto/behaviour.rs | 78 ++++++++++++++++--- .../protocol/generic_proto/handler/legacy.rs | 14 ++-- 2 files changed, 75 insertions(+), 17 deletions(-) diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 9ec23d0547..361ef58980 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -981,14 +981,30 @@ impl NetworkBehaviour for GenericProto { "`inject_disconnected` called for unknown peer {}", peer_id), - Some(PeerState::Disabled { banned_until, .. }) => { + Some(PeerState::Disabled { open, banned_until, .. }) => { + if !open.is_empty() { + debug_assert!(false); + error!( + target: "sub-libp2p", + "State mismatch: disconnected from {} with non-empty list of connections", + peer_id + ); + } debug!(target: "sub-libp2p", "Libp2p => Disconnected({}): Was disabled.", peer_id); if let Some(until) = banned_until { self.peers.insert(peer_id.clone(), PeerState::Banned { until }); } } - Some(PeerState::DisabledPendingEnable { timer_deadline, .. }) => { + Some(PeerState::DisabledPendingEnable { open, timer_deadline, .. }) => { + if !open.is_empty() { + debug_assert!(false); + error!( + target: "sub-libp2p", + "State mismatch: disconnected from {} with non-empty list of connections", + peer_id + ); + } debug!(target: "sub-libp2p", "Libp2p => Disconnected({}): Was disabled but pending enable.", peer_id); @@ -997,7 +1013,15 @@ impl NetworkBehaviour for GenericProto { self.peers.insert(peer_id.clone(), PeerState::Banned { until: timer_deadline }); } - Some(PeerState::Enabled { .. }) => { + Some(PeerState::Enabled { open, .. }) => { + if !open.is_empty() { + debug_assert!(false); + error!( + target: "sub-libp2p", + "State mismatch: disconnected from {} with non-empty list of connections", + peer_id + ); + } debug!(target: "sub-libp2p", "Libp2p => Disconnected({}): Was enabled.", peer_id); debug!(target: "sub-libp2p", "PSM <= Dropped({})", peer_id); self.peerset.dropped(peer_id.clone()); @@ -1088,8 +1112,16 @@ impl NetworkBehaviour for GenericProto { let last = match mem::replace(entry.get_mut(), PeerState::Poisoned) { PeerState::Enabled { mut open } => { - debug_assert!(open.iter().any(|c| c == &connection)); - open.retain(|c| c != &connection); + if let Some(pos) = open.iter().position(|c| c == &connection) { + open.remove(pos); + } else { + debug_assert!(false); + error!( + target: "sub-libp2p", + "State mismatch with {}: unknown closed connection", + source + ); + } debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", source); self.events.push(NetworkBehaviourAction::NotifyHandler { @@ -1114,8 +1146,17 @@ impl NetworkBehaviour for GenericProto { last }, PeerState::Disabled { mut open, banned_until } => { - debug_assert!(open.iter().any(|c| c == &connection)); - open.retain(|c| c != &connection); + if let Some(pos) = open.iter().position(|c| c == &connection) { + open.remove(pos); + } else { + debug_assert!(false); + error!( + target: "sub-libp2p", + "State mismatch with {}: unknown closed connection", + source + ); + } + let last = open.is_empty(); *entry.into_mut() = PeerState::Disabled { open, @@ -1128,8 +1169,17 @@ impl NetworkBehaviour for GenericProto { timer, timer_deadline } => { - debug_assert!(open.iter().any(|c| c == &connection)); - open.retain(|c| c != &connection); + if let Some(pos) = open.iter().position(|c| c == &connection) { + open.remove(pos); + } else { + debug_assert!(false); + error!( + target: "sub-libp2p", + "State mismatch with {}: unknown closed connection", + source + ); + } + let last = open.is_empty(); *entry.into_mut() = PeerState::DisabledPendingEnable { open, @@ -1168,7 +1218,15 @@ impl NetworkBehaviour for GenericProto { Some(PeerState::DisabledPendingEnable { ref mut open, .. }) | Some(PeerState::Disabled { ref mut open, .. }) => { let first = open.is_empty(); - open.push(connection); + if !open.iter().any(|c| *c == connection) { + open.push(connection); + } else { + error!( + target: "sub-libp2p", + "State mismatch: connection with {} opened a second time", + source + ); + } first } state => { diff --git a/client/network/src/protocol/generic_proto/handler/legacy.rs b/client/network/src/protocol/generic_proto/handler/legacy.rs index bc84fd847c..e51b37139b 100644 --- a/client/network/src/protocol/generic_proto/handler/legacy.rs +++ b/client/network/src/protocol/generic_proto/handler/legacy.rs @@ -115,7 +115,7 @@ impl IntoProtocolsHandler for LegacyProtoHandlerProto { remote_peer_id: remote_peer_id.clone(), state: ProtocolState::Init { substreams: SmallVec::new(), - init_deadline: Delay::new(Duration::from_secs(5)) + init_deadline: Delay::new(Duration::from_secs(20)) }, events_queue: SmallVec::new(), } @@ -353,26 +353,26 @@ impl LegacyProtoHandler { ProtocolState::Init { substreams, mut init_deadline } => { match Pin::new(&mut init_deadline).poll(cx) { Poll::Ready(()) => { - init_deadline = Delay::new(Duration::from_secs(60)); error!(target: "sub-libp2p", "Handler initialization process is too long \ - with {:?}", self.remote_peer_id) + with {:?}", self.remote_peer_id); + self.state = ProtocolState::KillAsap; }, - Poll::Pending => {} + Poll::Pending => { + self.state = ProtocolState::Init { substreams, init_deadline }; + } } - self.state = ProtocolState::Init { substreams, init_deadline }; None } ProtocolState::Opening { mut deadline } => { match Pin::new(&mut deadline).poll(cx) { Poll::Ready(()) => { - deadline = Delay::new(Duration::from_secs(60)); let event = LegacyProtoHandlerOut::ProtocolError { is_severe: true, error: "Timeout when opening protocol".to_string().into(), }; - self.state = ProtocolState::Opening { deadline }; + self.state = ProtocolState::KillAsap; Some(ProtocolsHandlerEvent::Custom(event)) }, Poll::Pending => { -- GitLab From 69a89fa7a00ea5f7f5c3c3b797eda76f6a703916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jon=20H=C3=A4ggblad?= Date: Wed, 13 May 2020 18:40:52 +0200 Subject: [PATCH 036/150] Fix minor clippy lints in grandpa (#5988) * grandpa: fix clippy lints about identity conversions * grandpa: fix clippy lints about unwrap_or_default * grandpa: fix clippy lints about explicit return * grandpa: fix clippy lints about unnecessary intermediary * grandpa: fix clippy lints about to_string * grandpa: fix clippy lints about unused imports * grandpa: fix clippy lints about increments * grandpa: fix clippy lints about unnecessary matches * grandpa: fix clippy lints about struct arguments * Fix clippy::redundant_clone * Fix clippy::clone_on_copy * Fix clippy::or_fun_call * Fix clippy::identity_conversion --- client/finality-grandpa/rpc/src/error.rs | 2 +- client/finality-grandpa/src/authorities.rs | 4 ++-- client/finality-grandpa/src/aux_schema.rs | 4 ++-- .../src/communication/gossip.rs | 4 ++-- .../finality-grandpa/src/communication/mod.rs | 12 +++++------- .../src/communication/periodic.rs | 4 ++-- client/finality-grandpa/src/environment.rs | 10 +++++----- client/finality-grandpa/src/finality_proof.rs | 6 +++--- client/finality-grandpa/src/import.rs | 16 ++++++++-------- client/finality-grandpa/src/justification.rs | 14 +++++++------- client/finality-grandpa/src/lib.rs | 17 +++++++---------- client/finality-grandpa/src/light_import.rs | 8 ++++---- client/finality-grandpa/src/observer.rs | 4 ++-- client/finality-grandpa/src/until_imported.rs | 6 +++--- 14 files changed, 53 insertions(+), 58 deletions(-) diff --git a/client/finality-grandpa/rpc/src/error.rs b/client/finality-grandpa/rpc/src/error.rs index 2a5e6955e5..c4a3877f51 100644 --- a/client/finality-grandpa/rpc/src/error.rs +++ b/client/finality-grandpa/rpc/src/error.rs @@ -33,7 +33,7 @@ pub enum Error { impl From for jsonrpc_core::Error { fn from(error: Error) -> Self { jsonrpc_core::Error { - message: format!("{}", error).into(), + message: format!("{}", error), code: jsonrpc_core::ErrorCode::ServerError(NOT_READY_ERROR_CODE), data: None, } diff --git a/client/finality-grandpa/src/authorities.rs b/client/finality-grandpa/src/authorities.rs index 80c1f4ad3f..12cb1456d3 100644 --- a/client/finality-grandpa/src/authorities.rs +++ b/client/finality-grandpa/src/authorities.rs @@ -229,8 +229,8 @@ where (&number, &hash), pending.delay); self.pending_standard_changes.import( - hash.clone(), - number.clone(), + hash, + number, pending, is_descendent_of, )?; diff --git a/client/finality-grandpa/src/aux_schema.rs b/client/finality-grandpa/src/aux_schema.rs index e4e8a98042..4ed96d058a 100644 --- a/client/finality-grandpa/src/aux_schema.rs +++ b/client/finality-grandpa/src/aux_schema.rs @@ -328,7 +328,7 @@ pub(crate) fn load_persistent( } Some(other) => return Err(ClientError::Backend( format!("Unsupported GRANDPA DB version: {:?}", other) - ).into()), + )), } // genesis. @@ -336,7 +336,7 @@ pub(crate) fn load_persistent( from genesis on what appears to be first startup."); let genesis_authorities = genesis_authorities()?; - let genesis_set = AuthoritySet::genesis(genesis_authorities.clone()) + let genesis_set = AuthoritySet::genesis(genesis_authorities) .expect("genesis authorities is non-empty; all weights are non-zero; qed."); let state = make_genesis_round(); let base = state.prevote_ghost diff --git a/client/finality-grandpa/src/communication/gossip.rs b/client/finality-grandpa/src/communication/gossip.rs index 183ffc65e8..7fe17e974b 100644 --- a/client/finality-grandpa/src/communication/gossip.rs +++ b/client/finality-grandpa/src/communication/gossip.rs @@ -887,7 +887,7 @@ impl Inner { // any catch up requests until we import this one (either with a // success or failure). self.pending_catch_up = PendingCatchUp::Processing { - instant: instant.clone(), + instant: *instant, }; // always discard catch up messages, they're point-to-point @@ -1281,7 +1281,7 @@ impl GossipValidator { inner: parking_lot::RwLock::new(Inner::new(config)), set_state, report_sender: tx, - metrics: metrics, + metrics, }; (val, rx) diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 16af54986a..d50968a468 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -236,16 +236,14 @@ impl> NetworkBridge { let (neighbor_packet_worker, neighbor_packet_sender) = periodic::NeighborPacketWorker::new(); - let bridge = NetworkBridge { + NetworkBridge { service, gossip_engine, validator, neighbor_sender: neighbor_packet_sender, neighbor_packet_worker: Arc::new(Mutex::new(neighbor_packet_worker)), gossip_validator_report_stream: Arc::new(Mutex::new(report_stream)), - }; - - bridge + } } /// Note the beginning of a new round to the `GossipValidator`. @@ -304,7 +302,7 @@ impl> NetworkBridge { match decoded { Err(ref e) => { debug!(target: "afg", "Skipping malformed message {:?}: {}", notification, e); - return future::ready(None); + future::ready(None) } Ok(GossipMessage::Vote(msg)) => { // check signature. @@ -343,7 +341,7 @@ impl> NetworkBridge { } _ => { debug!(target: "afg", "Skipping unknown message type"); - return future::ready(None); + future::ready(None) } } }); @@ -666,7 +664,7 @@ impl Sink> for OutgoingMessages // when locals exist, sign messages on import if let Some((ref pair, _)) = self.locals { - let target_hash = msg.target().0.clone(); + let target_hash = *(msg.target().0); let signed = sp_finality_grandpa::sign_message( msg, pair, diff --git a/client/finality-grandpa/src/communication/periodic.rs b/client/finality-grandpa/src/communication/periodic.rs index f894624bdf..dadd7deb57 100644 --- a/client/finality-grandpa/src/communication/periodic.rs +++ b/client/finality-grandpa/src/communication/periodic.rs @@ -86,7 +86,7 @@ impl Stream for NeighborPacketWorker { this.delay.reset(REBROADCAST_AFTER); this.last = Some((to.clone(), packet.clone())); - return Poll::Ready(Some((to, GossipMessage::::from(packet.clone())))); + return Poll::Ready(Some((to, GossipMessage::::from(packet)))); } // Don't return yet, maybe the timer fired. Poll::Pending => {}, @@ -108,6 +108,6 @@ impl Stream for NeighborPacketWorker { return Poll::Ready(Some((to.clone(), GossipMessage::::from(packet.clone())))); } - return Poll::Pending; + Poll::Pending } } diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index 1db1bcbb8d..34a2358159 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -108,7 +108,7 @@ impl Decode for CompletedRounds { fn decode(value: &mut I) -> Result { <(Vec>, SetId, Vec)>::decode(value) .map(|(rounds, set_id, voters)| CompletedRounds { - rounds: rounds.into(), + rounds, set_id, voters, }) @@ -248,14 +248,14 @@ impl VoterSetState { { if let VoterSetState::Live { completed_rounds, current_rounds } = self { if current_rounds.contains_key(&round) { - return Ok((completed_rounds, current_rounds)); + Ok((completed_rounds, current_rounds)) } else { let msg = "Voter acting on a live round we are not tracking."; - return Err(Error::Safety(msg.to_string())); + Err(Error::Safety(msg.to_string())) } } else { let msg = "Voter acting while in paused state."; - return Err(Error::Safety(msg.to_string())); + Err(Error::Safety(msg.to_string())) } } } @@ -622,7 +622,7 @@ where restricted_number >= base_header.number() && restricted_number < target_header.number() }) - .or(Some((target_header.hash(), *target_header.number()))) + .or_else(|| Some((target_header.hash(), *target_header.number()))) }, Ok(None) => { debug!(target: "afg", "Encountered error finding best chain containing {:?}: couldn't find target block", block); diff --git a/client/finality-grandpa/src/finality_proof.rs b/client/finality-grandpa/src/finality_proof.rs index bf3662aba3..867d2b27ab 100644 --- a/client/finality-grandpa/src/finality_proof.rs +++ b/client/finality-grandpa/src/finality_proof.rs @@ -183,7 +183,7 @@ impl sc_network::config::FinalityProofProvider for FinalityProo let request: FinalityProofRequest = Decode::decode(&mut &request[..]) .map_err(|e| { warn!(target: "afg", "Unable to decode finality proof request: {}", e.what()); - ClientError::Backend(format!("Invalid finality proof request")) + ClientError::Backend("Invalid finality proof request".to_string()) })?; match request { FinalityProofRequest::Original(request) => prove_finality::<_, _, GrandpaJustification>( @@ -397,7 +397,7 @@ pub(crate) fn prove_finality, J>( } // else search for the next justification - current_number = current_number + One::one(); + current_number += One::one(); } if finality_proof.is_empty() { @@ -513,7 +513,7 @@ fn check_finality_proof_fragment( new_authorities_proof, )?; - current_set_id = current_set_id + 1; + current_set_id += 1; } Ok(AuthoritiesOrEffects::Effects(FinalityEffects { diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index c1e32dfa6c..4960b23dc5 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -294,7 +294,7 @@ where } } - let number = block.header.number().clone(); + let number = *(block.header.number()); let maybe_change = self.check_new_change( &block.header, hash, @@ -326,7 +326,7 @@ where guard.as_mut().add_pending_change( change, &is_descendent_of, - ).map_err(|e| ConsensusError::from(ConsensusError::ClientImport(e.to_string())))?; + ).map_err(|e| ConsensusError::ClientImport(e.to_string()))?; } let applied_changes = { @@ -417,14 +417,14 @@ impl BlockImport new_cache: HashMap>, ) -> Result { let hash = block.post_hash(); - let number = block.header.number().clone(); + let number = *block.header.number(); // early exit if block already in chain, otherwise the check for // authority changes will error when trying to re-import a change block match self.inner.status(BlockId::Hash(hash)) { Ok(BlockStatus::InChain) => return Ok(ImportResult::AlreadyInChain), Ok(BlockStatus::Unknown) => {}, - Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string())), } // on initial sync we will restrict logging under info to avoid spam. @@ -456,7 +456,7 @@ impl BlockImport e, ); pending_changes.revert(); - return Err(ConsensusError::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string())); }, } }; @@ -466,7 +466,7 @@ impl BlockImport // Send the pause signal after import but BEFORE sending a `ChangeAuthorities` message. if do_pause { let _ = self.send_voter_commands.unbounded_send( - VoterCommand::Pause(format!("Forced change scheduled after inactivity")) + VoterCommand::Pause("Forced change scheduled after inactivity".to_string()) ); } @@ -633,7 +633,7 @@ where ); let justification = match justification { - Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string())), Ok(justification) => justification, }; @@ -668,7 +668,7 @@ where Error::Client(error) => ConsensusError::ClientImport(error.to_string()), Error::Safety(error) => ConsensusError::ClientImport(error), Error::Timer(error) => ConsensusError::ClientImport(error.to_string()), - }.into()); + }); }, Ok(_) => { assert!(!enacts_change, "returns Ok when no authority set change should be enacted; qed;"); diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index cbaa2cb441..98bc859b5f 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -61,7 +61,7 @@ impl GrandpaJustification { }; for signed in commit.precommits.iter() { - let mut current_hash = signed.precommit.target_hash.clone(); + let mut current_hash = signed.precommit.target_hash; loop { if current_hash == commit.target_hash { break; } @@ -71,7 +71,7 @@ impl GrandpaJustification { return error(); } - let parent_hash = current_header.parent_hash().clone(); + let parent_hash = *current_header.parent_hash(); if votes_ancestries_hashes.insert(current_hash) { votes_ancestries.push(current_header); } @@ -131,16 +131,16 @@ impl GrandpaJustification { let mut buf = Vec::new(); let mut visited_hashes = HashSet::new(); for signed in self.commit.precommits.iter() { - if let Err(_) = sp_finality_grandpa::check_message_signature_with_buffer( + if sp_finality_grandpa::check_message_signature_with_buffer( &finality_grandpa::Message::Precommit(signed.precommit.clone()), &signed.id, &signed.signature, self.round, set_id, &mut buf, - ) { + ).is_err() { return Err(ClientError::BadJustification( - "invalid signature for precommit in grandpa justification".to_string()).into()); + "invalid signature for precommit in grandpa justification".to_string())); } if self.commit.target_hash == signed.precommit.target_hash { @@ -157,7 +157,7 @@ impl GrandpaJustification { }, _ => { return Err(ClientError::BadJustification( - "invalid precommit ancestry proof in grandpa justification".to_string()).into()); + "invalid precommit ancestry proof in grandpa justification".to_string())); }, } } @@ -169,7 +169,7 @@ impl GrandpaJustification { if visited_hashes != ancestry_hashes { return Err(ClientError::BadJustification( - "invalid precommit ancestries in grandpa justification with unused headers".to_string()).into()); + "invalid precommit ancestries in grandpa justification with unused headers".to_string())); } Ok(()) diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index ac677bf3f3..c499912043 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -74,11 +74,8 @@ use sp_consensus::{SelectChain, BlockImport}; use sp_core::Pair; use sp_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver}; use sc_telemetry::{telemetry, CONSENSUS_INFO, CONSENSUS_DEBUG}; -use serde_json; use parking_lot::RwLock; -use sp_finality_tracker; - use finality_grandpa::Error as GrandpaError; use finality_grandpa::{voter, BlockNumberOps, voter_set::VoterSet}; @@ -474,7 +471,7 @@ impl GenesisAuthoritySetProvider for Arc( Ok(info.finalized_number) } })) - .map_err(|err| sp_consensus::Error::InherentData(err.into())) + .map_err(|err| sp_consensus::Error::InherentData(err)) } else { Ok(()) } @@ -731,7 +728,7 @@ pub fn run_grandpa_voter( let curr = authorities.current_authorities(); let mut auths = curr.iter().map(|(p, _)| p); let maybe_authority_id = authority_id(&mut auths, &conf.keystore) - .unwrap_or(Default::default()); + .unwrap_or_default(); telemetry!(CONSENSUS_INFO; "afg.authority_set"; "authority_id" => maybe_authority_id.to_string(), @@ -841,7 +838,7 @@ where set_id: persistent_data.authority_set.set_id(), authority_set: persistent_data.authority_set.clone(), consensus_changes: persistent_data.consensus_changes.clone(), - voter_set_state: persistent_data.set_state.clone(), + voter_set_state: persistent_data.set_state, metrics: metrics.as_ref().map(|m| m.environment.clone()), _phantom: PhantomData, }); @@ -868,7 +865,7 @@ where let authority_id = is_voter(&self.env.voters, &self.env.config.keystore) .map(|ap| ap.public()) - .unwrap_or(Default::default()); + .unwrap_or_default(); telemetry!(CONSENSUS_DEBUG; "afg.starting_new_voter"; "name" => ?self.env.config.name(), @@ -914,12 +911,12 @@ where global_comms, last_completed_round.number, last_completed_round.votes.clone(), - last_completed_round.base.clone(), + last_completed_round.base, last_finalized, ); // Repoint shared_voter_state so that the RPC endpoint can query the state - if let None = self.shared_voter_state.reset(voter.voter_state()) { + if self.shared_voter_state.reset(voter.voter_state()).is_none() { info!(target: "afg", "Timed out trying to update shared GRANDPA voter state. \ RPC endpoints may return stale data." diff --git a/client/finality-grandpa/src/light_import.rs b/client/finality-grandpa/src/light_import.rs index e9ca94ce98..b63c6f0bd7 100644 --- a/client/finality-grandpa/src/light_import.rs +++ b/client/finality-grandpa/src/light_import.rs @@ -169,7 +169,7 @@ impl FinalityProofImport if *pending_number > chain_info.finalized_number && *pending_number <= chain_info.best_number { - out.push((pending_hash.clone(), *pending_number)); + out.push((*pending_hash, *pending_number)); } } @@ -253,7 +253,7 @@ fn do_import_block( J: ProvableJustification, { let hash = block.post_hash(); - let number = block.header.number().clone(); + let number = *block.header.number(); // we don't want to finalize on `inner.import_block` let justification = block.justification.take(); @@ -263,7 +263,7 @@ fn do_import_block( let mut imported_aux = match import_result { Ok(ImportResult::Imported(aux)) => aux, Ok(r) => return Ok(r), - Err(e) => return Err(ConsensusError::ClientImport(e.to_string()).into()), + Err(e) => return Err(ConsensusError::ClientImport(e.to_string())), }; match justification { @@ -435,7 +435,7 @@ fn do_import_justification( hash, ); - return Err(ConsensusError::ClientImport(e.to_string()).into()); + return Err(ConsensusError::ClientImport(e.to_string())); }, Ok(justification) => { trace!( diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index ab06f06280..e00bfec44c 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -111,7 +111,7 @@ fn grandpa_observer( Err(e) => return future::err(e.into()), }; - if let Some(_) = validation_result.ghost() { + if validation_result.ghost().is_some() { let finalized_hash = commit.target_hash; let finalized_number = commit.target_number; @@ -189,7 +189,7 @@ where client, network, persistent_data, - config.keystore.clone(), + config.keystore, voter_commands_rx ); diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index 6f76ce3fa8..90f99519a7 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -258,7 +258,7 @@ impl Stream for UntilImported { // new block imported. queue up all messages tied to that hash. if let Some((_, _, messages)) = this.pending.remove(¬ification.hash) { - let canon_number = notification.header.number().clone(); + let canon_number = *notification.header.number(); let ready_messages = messages.into_iter() .filter_map(|m| m.wait_completed(canon_number)); @@ -359,7 +359,7 @@ impl BlockUntilImported for SignedMessage { } } - return Ok(DiscardWaitOrReady::Wait(vec![(target_hash, target_number, msg)])) + Ok(DiscardWaitOrReady::Wait(vec![(target_hash, target_number, msg)])) } fn wait_completed(self, canon_number: NumberFor) -> Option { @@ -430,7 +430,7 @@ impl BlockUntilImported for BlockGlobalMessage { let mut query_known = |target_hash, perceived_number| -> Result { // check integrity: all votes for same hash have same number. let canon_number = match checked_hashes.entry(target_hash) { - Entry::Occupied(entry) => entry.get().number().clone(), + Entry::Occupied(entry) => *entry.get().number(), Entry::Vacant(entry) => { if let Some(number) = status_check.block_number(target_hash)? { entry.insert(KnownOrUnknown::Known(number)); -- GitLab From 525dc61d32fdf2445e9c1927a720d5ea322647ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 13 May 2020 19:43:38 +0200 Subject: [PATCH 037/150] Handle clap errors manually and don't reset `SIGPIPE` (#6012) Instead of resetting `SIGPIPE` to the system default handler, we now handle a clap error manually and ignore any error when writing to `stdout`/`stderr`. In this way, the node does not silently stops when it encounters a `SIGPIPE` in normal mode and we still support piping of the cli output. --- bin/node/cli/src/command.rs | 2 -- client/cli/src/lib.rs | 40 +++++++++++++++++++------------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 91c6298c9f..81a22011b5 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -63,8 +63,6 @@ impl SubstrateCli for Cli { /// Parse command line arguments into service configuration. pub fn run() -> Result<()> { - sc_cli::reset_signal_pipe_handler()?; - let cli = Cli::from_args(); match &cli.subcommand { diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index e723573bc2..2b26259b92 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -129,7 +129,27 @@ pub trait SubstrateCli: Sized { AppSettings::SubcommandsNegateReqs, ]); - ::from_clap(&app.get_matches_from(iter)) + let matches = match app.get_matches_from_safe(iter) { + Ok(matches) => matches, + Err(mut e) => { + // To support pipes, we can not use `writeln!` as any error + // results in a "broken pipe" error. + // + // Instead we write directly to `stdout` and ignore any error + // as we exit afterwards anyway. + e.message.extend("\n".chars()); + + if e.use_stderr() { + let _ = std::io::stderr().write_all(e.message.as_bytes()); + std::process::exit(1); + } else { + let _ = std::io::stdout().write_all(e.message.as_bytes()); + std::process::exit(0); + } + }, + }; + + ::from_clap(&matches) } /// Helper function used to parse the command line arguments. This is the equivalent of @@ -264,21 +284,3 @@ fn kill_color(s: &str) -> String { } RE.replace_all(s, "").to_string() } - -/// Reset the signal pipe (`SIGPIPE`) handler to the default one provided by the system. -/// This will end the program on `SIGPIPE` instead of panicking. -/// -/// This should be called before calling any cli method or printing any output. -pub fn reset_signal_pipe_handler() -> Result<()> { - #[cfg(target_family = "unix")] - { - use nix::sys::signal; - - unsafe { - signal::signal(signal::Signal::SIGPIPE, signal::SigHandler::SigDfl) - .map_err(|e| Error::Other(e.to_string()))?; - } - } - - Ok(()) -} -- GitLab From 8ba59a8f04663fa8f22aff38db3b98c0fc1b92fb Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Wed, 13 May 2020 19:44:54 +0200 Subject: [PATCH 038/150] Convert `Public` to `CryptoTypePublicPair` (#6014) * Tabify code * Implement CryptoTypePublicPair in app_crypto * Cleanup redundancy * Introduce to_public_crypto_pair to Public trait * Implement method for test --- primitives/application-crypto/src/ed25519.rs | 14 -------------- primitives/application-crypto/src/lib.rs | 19 +++++++++++++++++++ primitives/application-crypto/src/sr25519.rs | 14 -------------- primitives/authority-discovery/src/lib.rs | 17 ++--------------- primitives/core/src/crypto.rs | 12 ++++++++++++ primitives/core/src/ecdsa.rs | 6 +++++- primitives/core/src/ed25519.rs | 16 ++++++++++------ primitives/core/src/sr25519.rs | 4 ++++ 8 files changed, 52 insertions(+), 50 deletions(-) diff --git a/primitives/application-crypto/src/ed25519.rs b/primitives/application-crypto/src/ed25519.rs index 5be79ff4f7..c35cb30457 100644 --- a/primitives/application-crypto/src/ed25519.rs +++ b/primitives/application-crypto/src/ed25519.rs @@ -23,27 +23,13 @@ use sp_std::vec::Vec; pub use sp_core::ed25519::*; mod app { - use sp_core::crypto::{CryptoTypePublicPair, Public as TraitPublic}; use sp_core::testing::ED25519; - use sp_core::ed25519::CRYPTO_ID; crate::app_crypto!(super, ED25519); impl crate::traits::BoundToRuntimeAppPublic for Public { type Public = Self; } - - impl From for CryptoTypePublicPair { - fn from(key: Public) -> Self { - (&key).into() - } - } - - impl From<&Public> for CryptoTypePublicPair { - fn from(key: &Public) -> Self { - CryptoTypePublicPair(CRYPTO_ID, key.to_raw_vec()) - } - } } pub use app::{Public as AppPublic, Signature as AppSignature}; diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index 36fd511ff4..9fa82deca7 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -262,6 +262,10 @@ macro_rules! app_crypto_public_common { impl $crate::Public for Public { fn from_slice(x: &[u8]) -> Self { Self(<$public>::from_slice(x)) } + + fn to_public_crypto_pair(&self) -> $crate::CryptoTypePublicPair { + $crate::CryptoTypePublicPair($crypto_type, self.to_raw_vec()) + } } impl $crate::AppPublic for Public { @@ -298,6 +302,21 @@ macro_rules! app_crypto_public_common { <$public as $crate::RuntimePublic>::to_raw_vec(&self.0) } } + + impl From for $crate::CryptoTypePublicPair { + fn from(key: Public) -> Self { + (&key).into() + } + } + + impl From<&Public> for $crate::CryptoTypePublicPair { + fn from(key: &Public) -> Self { + $crate::CryptoTypePublicPair( + $crypto_type, + $crate::Public::to_raw_vec(key), + ) + } + } } } diff --git a/primitives/application-crypto/src/sr25519.rs b/primitives/application-crypto/src/sr25519.rs index a0f2cef1c4..cd1472f617 100644 --- a/primitives/application-crypto/src/sr25519.rs +++ b/primitives/application-crypto/src/sr25519.rs @@ -23,27 +23,13 @@ use sp_std::vec::Vec; pub use sp_core::sr25519::*; mod app { - use sp_core::crypto::{CryptoTypePublicPair, Public as TraitPublic}; use sp_core::testing::SR25519; - use sp_core::sr25519::CRYPTO_ID; crate::app_crypto!(super, SR25519); impl crate::traits::BoundToRuntimeAppPublic for Public { type Public = Self; } - - impl From for CryptoTypePublicPair { - fn from(key: Public) -> Self { - (&key).into() - } - } - - impl From<&Public> for CryptoTypePublicPair { - fn from(key: &Public) -> Self { - CryptoTypePublicPair(CRYPTO_ID, key.to_raw_vec()) - } - } } pub use app::{Public as AppPublic, Signature as AppSignature}; diff --git a/primitives/authority-discovery/src/lib.rs b/primitives/authority-discovery/src/lib.rs index 68680ad759..0f434bd313 100644 --- a/primitives/authority-discovery/src/lib.rs +++ b/primitives/authority-discovery/src/lib.rs @@ -22,24 +22,11 @@ use sp_std::vec::Vec; mod app { use sp_application_crypto::{ - CryptoTypePublicPair, key_types::AUTHORITY_DISCOVERY, - Public as _, app_crypto, - sr25519}; + sr25519, + }; app_crypto!(sr25519, AUTHORITY_DISCOVERY); - - impl From for CryptoTypePublicPair { - fn from(key: Public) -> Self { - (&key).into() - } - } - - impl From<&Public> for CryptoTypePublicPair { - fn from(key: &Public) -> Self { - CryptoTypePublicPair(sr25519::CRYPTO_ID, key.to_raw_vec()) - } - } } sp_application_crypto::with_pair! { diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index f725e94a42..769bf20bfc 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -559,6 +559,8 @@ pub trait Public: /// Return a slice filled with raw data. fn as_slice(&self) -> &[u8] { self.as_ref() } + /// Return `CryptoTypePublicPair` from public key. + fn to_public_crypto_pair(&self) -> CryptoTypePublicPair; } /// An opaque 32-byte cryptographic identifier. @@ -706,6 +708,11 @@ mod dummy { #[cfg(feature = "std")] fn to_raw_vec(&self) -> Vec { vec![] } fn as_slice(&self) -> &[u8] { b"" } + fn to_public_crypto_pair(&self) -> CryptoTypePublicPair { + CryptoTypePublicPair( + CryptoTypeId(*b"dumm"), Public::to_raw_vec(self) + ) + } } impl Pair for Dummy { @@ -1061,6 +1068,11 @@ mod tests { fn to_raw_vec(&self) -> Vec { vec![] } + fn to_public_crypto_pair(&self) -> CryptoTypePublicPair { + CryptoTypePublicPair( + CryptoTypeId(*b"dumm"), self.to_raw_vec(), + ) + } } impl Pair for TestPair { type Public = TestPublic; diff --git a/primitives/core/src/ecdsa.rs b/primitives/core/src/ecdsa.rs index 8a45157844..b04a379a3d 100644 --- a/primitives/core/src/ecdsa.rs +++ b/primitives/core/src/ecdsa.rs @@ -36,7 +36,7 @@ use crate::{hashing::blake2_256, crypto::{Pair as TraitPair, DeriveJunction, Sec use crate::crypto::Ss58Codec; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; -use crate::crypto::{Public as TraitPublic, UncheckedFrom, CryptoType, Derive, CryptoTypeId}; +use crate::crypto::{Public as TraitPublic, CryptoTypePublicPair, UncheckedFrom, CryptoType, Derive, CryptoTypeId}; #[cfg(feature = "full_crypto")] use secp256k1::{PublicKey, SecretKey}; @@ -118,6 +118,10 @@ impl TraitPublic for Public { r.copy_from_slice(data); Self(r) } + + fn to_public_crypto_pair(&self) -> CryptoTypePublicPair { + CryptoTypePublicPair(CRYPTO_ID, self.to_raw_vec()) + } } impl Derive for Public {} diff --git a/primitives/core/src/ed25519.rs b/primitives/core/src/ed25519.rs index abeac05388..cc62b49784 100644 --- a/primitives/core/src/ed25519.rs +++ b/primitives/core/src/ed25519.rs @@ -377,20 +377,24 @@ impl TraitPublic for Public { r.copy_from_slice(data); Public(r) } + + fn to_public_crypto_pair(&self) -> CryptoTypePublicPair { + CryptoTypePublicPair(CRYPTO_ID, self.to_raw_vec()) + } } impl Derive for Public {} impl From for CryptoTypePublicPair { - fn from(key: Public) -> Self { - (&key).into() - } + fn from(key: Public) -> Self { + (&key).into() + } } impl From<&Public> for CryptoTypePublicPair { - fn from(key: &Public) -> Self { - CryptoTypePublicPair(CRYPTO_ID, key.to_raw_vec()) - } + fn from(key: &Public) -> Self { + CryptoTypePublicPair(CRYPTO_ID, key.to_raw_vec()) + } } /// Derive a single hard junction. diff --git a/primitives/core/src/sr25519.rs b/primitives/core/src/sr25519.rs index cadfb25776..7af1ed6d5a 100644 --- a/primitives/core/src/sr25519.rs +++ b/primitives/core/src/sr25519.rs @@ -391,6 +391,10 @@ impl TraitPublic for Public { r.copy_from_slice(data); Public(r) } + + fn to_public_crypto_pair(&self) -> CryptoTypePublicPair { + CryptoTypePublicPair(CRYPTO_ID, self.to_raw_vec()) + } } impl From for CryptoTypePublicPair { -- GitLab From 420086de2a535e677f20f805ca4425f656fdf078 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 13 May 2020 19:50:01 +0200 Subject: [PATCH 039/150] Fix potential state mismatch in behaviour.rs (#6013) * Fix state mismatch in behaviour.rs * Add TODO --- .../src/protocol/generic_proto/behaviour.rs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 361ef58980..7bb5d986ca 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -1123,25 +1123,25 @@ impl NetworkBehaviour for GenericProto { ); } + // TODO: We switch the entire peer state to "disabled" because of possible + // race conditions involving the legacy substream. + // Once https://github.com/paritytech/substrate/issues/5670 is done, this + // should be changed to stay in the `Enabled` state. debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", source); + debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", source); + self.peerset.dropped(source.clone()); self.events.push(NetworkBehaviourAction::NotifyHandler { peer_id: source.clone(), - handler: NotifyHandler::One(connection), + handler: NotifyHandler::All, event: NotifsHandlerIn::Disable, }); let last = open.is_empty(); - if last { - debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", source); - self.peerset.dropped(source.clone()); - *entry.into_mut() = PeerState::Disabled { - open, - banned_until: None - }; - } else { - *entry.into_mut() = PeerState::Enabled { open }; - } + *entry.into_mut() = PeerState::Disabled { + open, + banned_until: None + }; last }, -- GitLab From 14e60f88a4e9061bed52bf7d4c0cf7d899f89448 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 13 May 2020 23:48:28 +0300 Subject: [PATCH 040/150] properly handle different block content (#6007) --- bin/node/bench/src/import.rs | 24 +++++++------- bin/node/bench/src/main.rs | 16 ++++----- bin/node/testing/src/bench.rs | 62 +++++++++++++++++++++-------------- 3 files changed, 56 insertions(+), 46 deletions(-) diff --git a/bin/node/bench/src/import.rs b/bin/node/bench/src/import.rs index 10f5ee8dca..a311bb1b1b 100644 --- a/bin/node/bench/src/import.rs +++ b/bin/node/bench/src/import.rs @@ -50,19 +50,19 @@ pub enum SizeType { #[display(fmt = "full")] Full, #[display(fmt = "custom")] - Custom, + Custom(usize), } impl SizeType { - pub fn transactions(&self) -> usize { + pub fn transactions(&self) -> Option { match self { - SizeType::Empty => 0, - SizeType::Small => 10, - SizeType::Medium => 100, - SizeType::Large => 500, - SizeType::Full => 4000, + SizeType::Empty => Some(0), + SizeType::Small => Some(10), + SizeType::Medium => Some(100), + SizeType::Large => Some(500), + SizeType::Full => None, // Custom SizeType will use the `--transactions` input parameter - SizeType::Custom => 0, + SizeType::Custom(val) => Some(*val), } } } @@ -97,9 +97,9 @@ impl core::BenchmarkDescription for ImportBenchmarkDescription { } match self.block_type { - BlockType::RandomTransfersKeepAlive(_) => path.push("transfer_keep_alive"), - BlockType::RandomTransfersReaping(_) => path.push("transfer_reaping"), - BlockType::Noop(_) => path.push("noop"), + BlockType::RandomTransfersKeepAlive => path.push("transfer_keep_alive"), + BlockType::RandomTransfersReaping => path.push("transfer_reaping"), + BlockType::Noop => path.push("noop"), } match self.database_type { @@ -119,7 +119,7 @@ impl core::BenchmarkDescription for ImportBenchmarkDescription { 50_000, self.key_types ); - let block = bench_db.generate_block(self.block_type); + let block = bench_db.generate_block(self.block_type.to_content(self.size.transactions())); Box::new(ImportBenchmark { database: bench_db, block, diff --git a/bin/node/bench/src/main.rs b/bin/node/bench/src/main.rs index df7e4c2da2..ed4f9fe107 100644 --- a/bin/node/bench/src/main.rs +++ b/bin/node/bench/src/main.rs @@ -79,19 +79,15 @@ fn main() { SizeType::Medium, SizeType::Large, SizeType::Full, - SizeType::Custom, + SizeType::Custom(opt.transactions.unwrap_or(0)), ].iter() { - let txs = match size { - SizeType::Custom => opt.transactions.unwrap_or(0), - _ => size.transactions() - }; for block_type in [ - BlockType::RandomTransfersKeepAlive(txs), - BlockType::RandomTransfersReaping(txs), - BlockType::Noop(txs), + BlockType::RandomTransfersKeepAlive, + BlockType::RandomTransfersReaping, + BlockType::Noop, ].iter() { for database_type in [BenchDataBaseType::RocksDb, BenchDataBaseType::ParityDb].iter() { - import_benchmarks.push((profile, size, block_type.clone(), database_type)); + import_benchmarks.push((profile, size.clone(), block_type.clone(), database_type)); } } } @@ -102,7 +98,7 @@ fn main() { ImportBenchmarkDescription { profile: *profile, key_types: KeyTypes::Sr25519, - size: *size, + size: size, block_type: block_type, database_type: *database_type, }, diff --git a/bin/node/testing/src/bench.rs b/bin/node/testing/src/bench.rs index b784d9f42b..4355d0e44d 100644 --- a/bin/node/testing/src/bench.rs +++ b/bin/node/testing/src/bench.rs @@ -132,11 +132,36 @@ impl Clone for BenchDb { #[derive(Debug, PartialEq, Clone, Copy)] pub enum BlockType { /// Bunch of random transfers. - RandomTransfersKeepAlive(usize), + RandomTransfersKeepAlive, /// Bunch of random transfers that drain all of the source balance. - RandomTransfersReaping(usize), + RandomTransfersReaping, /// Bunch of "no-op" calls. - Noop(usize), + Noop, +} + +impl BlockType { + /// Create block content description with specified number of transactions. + pub fn to_content(self, size: Option) -> BlockContent { + BlockContent { + block_type: self, + size: size, + } + } +} + +/// Content of the generated block. +pub struct BlockContent { + block_type: BlockType, + size: Option, +} + +impl BlockContent { + fn iter_while(&self, mut f: impl FnMut(usize) -> bool) { + match self.size { + Some(v) => { for i in 0..v { if !f(i) { break; }}} + None => { for i in 0.. { if !f(i) { break; }}} + } + } } /// Type of backend database. @@ -162,15 +187,6 @@ impl DatabaseType { } } -impl BlockType { - /// Number of transactions for this block type. - pub fn transactions(&self) -> usize { - match self { - Self::RandomTransfersKeepAlive(v) | Self::RandomTransfersReaping(v) | Self::Noop(v) => *v, - } - } -} - /// Benchmarking task executor. /// /// Uses multiple threads as the regular executable. @@ -271,7 +287,7 @@ impl BenchDb { } /// Generate new block using this database. - pub fn generate_block(&mut self, block_type: BlockType) -> Block { + pub fn generate_block(&mut self, content: BlockContent) -> Block { let (client, _backend) = Self::bench_client( self.database_type, self.directory_guard.path(), @@ -310,10 +326,8 @@ impl BenchDb { block.push(extrinsic).expect("Push inherent failed"); } - let mut iteration = 0; let start = std::time::Instant::now(); - for _ in 0..block_type.transactions() { - + content.iter_while(|iteration| { let sender = self.keyring.at(iteration); let receiver = get_account_id_from_seed::( &format!("random-user//{}", iteration) @@ -322,8 +336,8 @@ impl BenchDb { let signed = self.keyring.sign( CheckedExtrinsic { signed: Some((sender, signed_extra(0, node_runtime::ExistentialDeposit::get() + 1))), - function: match block_type { - BlockType::RandomTransfersKeepAlive(_) => { + function: match content.block_type { + BlockType::RandomTransfersKeepAlive => { Call::Balances( BalancesCall::transfer_keep_alive( pallet_indices::address::Address::Id(receiver), @@ -331,7 +345,7 @@ impl BenchDb { ) ) }, - BlockType::RandomTransfersReaping(_) => { + BlockType::RandomTransfersReaping => { Call::Balances( BalancesCall::transfer( pallet_indices::address::Address::Id(receiver), @@ -341,7 +355,7 @@ impl BenchDb { ) ) }, - BlockType::Noop(_) => { + BlockType::Noop => { Call::System( SystemCall::remark(Vec::new()) ) @@ -361,13 +375,13 @@ impl BenchDb { Err(sp_blockchain::Error::ApplyExtrinsicFailed( sp_blockchain::ApplyExtrinsicFailed::Validity(e) )) if e.exhausted_resources() => { - break; + return false; }, Err(err) => panic!("Error pushing transaction: {:?}", err), - Ok(_) => {}, + Ok(_) => true, } - iteration += 1; - } + }); + let block = block.build().expect("Block build failed").block; log::info!( -- GitLab From 9d2665f5ef0716e69da09fda334d23fa7a539804 Mon Sep 17 00:00:00 2001 From: emostov <32168567+emostov@users.noreply.github.com> Date: Wed, 13 May 2020 13:48:49 -0700 Subject: [PATCH 041/150] Add tests to Sudo Pallet (#5963) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * transition treasury to configurable moduleids * make election module id configurable * convert runtime and pallet to accept module id config elections-phragmen * add ModuleId to evm pallet * change society pallet to configurable module id * delete commented out module_id * fix merge residual compile errors * setup initial mock structure * establish privelleged function test * save progress * first pass new_test_ext * test sudo to make sure it error when non-root * add set keys tests * fix unused result from set_key call * remove unused imports warnings * pre master merge * Expose BlockHashCount on system metadata constants (#5960) * squash * fix whitespace * spelling and whitespace * a single pesky space * add logger module to mock * add logger dispatch to privlleged function * sub logger in for dummy functions * create first of several event tests * first pass at test coverage for events * comment house keeping * spell check * Expose BlockHashCount on system metadata constants (#5960) * establish privelleged function test * save progress * first pass new_test_ext * test sudo to make sure it error when non-root * add set keys tests * fix unused result from set_key call * remove unused imports warnings * pre master merge * squash * fix whitespace * spelling and whitespace * a single pesky space * add logger module to mock * add logger dispatch to privlleged function * sub logger in for dummy functions * create first of several event tests * first pass at test coverage for events * comment house keeping * implement last_seen_account storage item, event, and, logger function * create vec account log and use in tests * allow weight to be passed into account log * refactor all log dispatchables * save progress * complete initial transition to refactored logger * cleaning * fix merge residual compile errors setup initial mock structure establish privelleged function test save progress first pass new_test_ext test sudo to make sure it error when non-root add set keys tests fix unused result from set_key call parent 5151bd784545ededa6153052a93fcc309f7b3885 author zeke 1589076740 -0700 committer zeke 1589350443 -0700 parent 5151bd784545ededa6153052a93fcc309f7b3885 author zeke 1589076740 -0700 committer zeke 1589350442 -0700 remove unused imports warnings fix unused result from set_key call remove unused imports warnings pre master merge Expose BlockHashCount on system metadata constants (#5960) squash fix whitespace spelling and whitespace a single pesky space add logger module to mock add logger dispatch to privlleged function sub logger in for dummy functions create first of several event tests first pass at test coverage for events comment house keeping pre master merge Expose BlockHashCount on system metadata constants (#5960) Expose BlockHashCount on system metadata constants (#5960) fix whitespace spell check implement last_seen_account storage item, event, and, logger function create vec account log and use in tests allow weight to be passed into account log refactor all log dispatchables save progress complete initial transition to refactored logger cleaning * clean up * cleaning * condense non_privileged logs into 1 fn * Apply suggestions from code review Co-authored-by: Jaco Greeff Co-authored-by: Bastian Köcher --- frame/sudo/src/lib.rs | 5 ++ frame/sudo/src/mock.rs | 174 ++++++++++++++++++++++++++++++++++++++++ frame/sudo/src/tests.rs | 168 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 347 insertions(+) create mode 100644 frame/sudo/src/mock.rs create mode 100644 frame/sudo/src/tests.rs diff --git a/frame/sudo/src/lib.rs b/frame/sudo/src/lib.rs index 21ae841c79..eed23a86fb 100644 --- a/frame/sudo/src/lib.rs +++ b/frame/sudo/src/lib.rs @@ -95,6 +95,11 @@ use frame_support::{ use frame_support::weights::{Weight, GetDispatchInfo, FunctionOf, Pays}; use frame_system::{self as system, ensure_signed}; +#[cfg(test)] +mod mock; +#[cfg(test)] +mod tests; + pub trait Trait: frame_system::Trait { /// The overarching event type. type Event: From> + Into<::Event>; diff --git a/frame/sudo/src/mock.rs b/frame/sudo/src/mock.rs new file mode 100644 index 0000000000..b8298182c5 --- /dev/null +++ b/frame/sudo/src/mock.rs @@ -0,0 +1,174 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Test utilities + +use super::*; +use frame_support::{ + impl_outer_origin, impl_outer_dispatch, impl_outer_event, parameter_types, + weights::{Weight, DispatchClass} +}; +use sp_core::H256; +// The testing primitives are very useful for avoiding having to work with signatures +// or public keys. +use sp_runtime::{Perbill, traits::{BlakeTwo256, IdentityLookup}, testing::Header}; +use sp_io; +use crate as sudo; + +// Logger module to track execution. +pub mod logger { + use super::*; + use frame_system::ensure_root; + + pub trait Trait: system::Trait { + type Event: From> + Into<::Event>; + } + + decl_storage! { + trait Store for Module as Logger { + AccountLog get(fn account_log): Vec; + I32Log get(fn i32_log): Vec; + } + } + + decl_event! { + pub enum Event where AccountId = ::AccountId { + AppendI32(i32, Weight), + AppendI32AndAccount(AccountId, i32, Weight), + } + } + + decl_module! { + pub struct Module for enum Call where origin: ::Origin { + fn deposit_event() = default; + + #[weight = FunctionOf( + |args: (&i32, &Weight)| *args.1, + DispatchClass::Normal, + Pays::Yes, + )] + fn privileged_i32_log(origin, i: i32, weight: Weight){ + // Ensure that the `origin` is `Root`. + ensure_root(origin)?; + ::append(i); + Self::deposit_event(RawEvent::AppendI32(i, weight)); + } + + #[weight = FunctionOf( + |args: (&i32, &Weight)| *args.1, + DispatchClass::Normal, + Pays::Yes, + )] + fn non_privileged_log(origin, i: i32, weight: Weight){ + // Ensure that the `origin` is some signed account. + let sender = ensure_signed(origin)?; + ::append(i); + >::append(sender.clone()); + Self::deposit_event(RawEvent::AppendI32AndAccount(sender, i, weight)); + } + } + } +} + +impl_outer_origin! { + pub enum Origin for Test where system = frame_system {} +} + +mod test_events { + pub use crate::Event; +} + +impl_outer_event! { + pub enum TestEvent for Test { + system, + sudo, + logger, + } +} + +impl_outer_dispatch! { + pub enum Call for Test where origin: Origin { + sudo::Sudo, + logger::Logger, + } +} + +// For testing the pallet, we construct most of a mock runtime. This means +// first constructing a configuration type (`Test`) which `impl`s each of the +// configuration traits of pallets we want to use. +#[derive(Clone, Eq, PartialEq)] +pub struct Test; + +parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockLength: u32 = 2 * 1024; + pub const AvailableBlockRatio: Perbill = Perbill::one(); +} + +impl frame_system::Trait for Test { + type Origin = Origin; + type Call = Call; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type Header = Header; + type Event = TestEvent; + type BlockHashCount = BlockHashCount; + type MaximumBlockWeight = MaximumBlockWeight; + type DbWeight = (); + type BlockExecutionWeight = (); + type ExtrinsicBaseWeight = (); + type MaximumBlockLength = MaximumBlockLength; + type AvailableBlockRatio = AvailableBlockRatio; + type Version = (); + type ModuleToIndex = (); + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); +} + +// Implement the logger module's `Trait` on the Test runtime. +impl logger::Trait for Test { + type Event = TestEvent; +} + +// Implement the sudo module's `Trait` on the Test runtime. +impl Trait for Test { + type Event = TestEvent; + type Call = Call; +} + +// Assign back to type variables in order to make dispatched calls of these modules later. +pub type Sudo = Module; +pub type Logger = logger::Module; +pub type System = system::Module; + +// New types for dispatchable functions. +pub type SudoCall = sudo::Call; +pub type LoggerCall = logger::Call; + +// Build test environment by setting the root `key` for the Genesis. +pub fn new_test_ext(root_key: u64) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); + GenesisConfig::{ + key: root_key, + }.assimilate_storage(&mut t).unwrap(); + t.into() +} diff --git a/frame/sudo/src/tests.rs b/frame/sudo/src/tests.rs new file mode 100644 index 0000000000..5a7c0ed10b --- /dev/null +++ b/frame/sudo/src/tests.rs @@ -0,0 +1,168 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Tests for the module. + +use super::*; +use mock::{ + Sudo, SudoCall, Origin, Call, Test, new_test_ext, LoggerCall, Logger, System, TestEvent, +}; +use frame_support::{assert_ok, assert_noop}; + +#[test] +fn test_setup_works() { + // Environment setup, logger storage, and sudo `key` retrieval should work as expected. + new_test_ext(1).execute_with(|| { + assert_eq!(Sudo::key(), 1u64); + assert_eq!(Logger::i32_log(), vec![]); + assert_eq!(Logger::account_log(), vec![]); + }); +} + +#[test] +fn sudo_basics() { + // Configure a default test environment and set the root `key` to 1. + new_test_ext(1).execute_with(|| { + // A privileged function should work when `sudo` is passed the root `key` as `origin`. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1_000))); + assert_ok!(Sudo::sudo(Origin::signed(1), call)); + assert_eq!(Logger::i32_log(), vec![42i32]); + + // A privileged function should not work when `sudo` is passed a non-root `key` as `origin`. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1_000))); + assert_noop!(Sudo::sudo(Origin::signed(2), call), Error::::RequireSudo); + }); +} + +#[test] +fn sudo_emits_events_correctly() { + new_test_ext(1).execute_with(|| { + // Set block number to 1 because events are not emitted on block 0. + System::set_block_number(1); + + // Should emit event to indicate success when called with the root `key` and `call` is `Ok`. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1))); + assert_ok!(Sudo::sudo(Origin::signed(1), call)); + let expected_event = TestEvent::sudo(RawEvent::Sudid(Ok(()))); + assert!(System::events().iter().any(|a| a.event == expected_event)); + }) +} + +#[test] +fn sudo_unchecked_weight_basics() { + new_test_ext(1).execute_with(|| { + // A privileged function should work when `sudo` is passed the root `key` as origin. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1_000))); + assert_ok!(Sudo::sudo_unchecked_weight(Origin::signed(1), call, 1_000)); + assert_eq!(Logger::i32_log(), vec![42i32]); + + // A privileged function should not work when called with a non-root `key`. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1_000))); + assert_noop!( + Sudo::sudo_unchecked_weight(Origin::signed(2), call, 1_000), + Error::::RequireSudo, + ); + // `I32Log` is unchanged after unsuccessful call. + assert_eq!(Logger::i32_log(), vec![42i32]); + + // Controls the dispatched weight. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1))); + let sudo_unchecked_weight_call = SudoCall::sudo_unchecked_weight(call, 1_000); + let info = sudo_unchecked_weight_call.get_dispatch_info(); + assert_eq!(info.weight, 1_000); + }); +} + +#[test] +fn sudo_unchecked_weight_emits_events_correctly() { + new_test_ext(1).execute_with(|| { + // Set block number to 1 because events are not emitted on block 0. + System::set_block_number(1); + + // Should emit event to indicate success when called with the root `key` and `call` is `Ok`. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1))); + assert_ok!(Sudo::sudo_unchecked_weight(Origin::signed(1), call, 1_000)); + let expected_event = TestEvent::sudo(RawEvent::Sudid(Ok(()))); + assert!(System::events().iter().any(|a| a.event == expected_event)); + }) +} + +#[test] +fn set_key_basics() { + new_test_ext(1).execute_with(|| { + // A root `key` can change the root `key` + assert_ok!(Sudo::set_key(Origin::signed(1), 2)); + assert_eq!(Sudo::key(), 2u64); + }); + + new_test_ext(1).execute_with(|| { + // A non-root `key` will trigger a `RequireSudo` error and a non-root `key` cannot change the root `key`. + assert_noop!(Sudo::set_key(Origin::signed(2), 3), Error::::RequireSudo); + }); +} + +#[test] +fn set_key_emits_events_correctly() { + new_test_ext(1).execute_with(|| { + // Set block number to 1 because events are not emitted on block 0. + System::set_block_number(1); + + // A root `key` can change the root `key`. + assert_ok!(Sudo::set_key(Origin::signed(1), 2)); + let expected_event = TestEvent::sudo(RawEvent::KeyChanged(1)); + assert!(System::events().iter().any(|a| a.event == expected_event)); + // Double check. + assert_ok!(Sudo::set_key(Origin::signed(2), 4)); + let expected_event = TestEvent::sudo(RawEvent::KeyChanged(2)); + assert!(System::events().iter().any(|a| a.event == expected_event)); + }); +} + +#[test] +fn sudo_as_basics() { + new_test_ext(1).execute_with(|| { + // A privileged function will not work when passed to `sudo_as`. + let call = Box::new(Call::Logger(LoggerCall::privileged_i32_log(42, 1_000))); + assert_ok!(Sudo::sudo_as(Origin::signed(1), 2, call)); + assert_eq!(Logger::i32_log(), vec![]); + assert_eq!(Logger::account_log(), vec![]); + + // A non-privileged function should not work when called with a non-root `key`. + let call = Box::new(Call::Logger(LoggerCall::non_privileged_log(42, 1))); + assert_noop!(Sudo::sudo_as(Origin::signed(3), 2, call), Error::::RequireSudo); + + // A non-privileged function will work when passed to `sudo_as` with the root `key`. + let call = Box::new(Call::Logger(LoggerCall::non_privileged_log(42, 1))); + assert_ok!(Sudo::sudo_as(Origin::signed(1), 2, call)); + assert_eq!(Logger::i32_log(), vec![42i32]); + // The correct user makes the call within `sudo_as`. + assert_eq!(Logger::account_log(), vec![2]); + }); +} + +#[test] +fn sudo_as_emits_events_correctly() { + new_test_ext(1).execute_with(|| { + // Set block number to 1 because events are not emitted on block 0. + System::set_block_number(1); + + // A non-privileged function will work when passed to `sudo_as` with the root `key`. + let call = Box::new(Call::Logger(LoggerCall::non_privileged_log(42, 1))); + assert_ok!(Sudo::sudo_as(Origin::signed(1), 2, call)); + let expected_event = TestEvent::sudo(RawEvent::SudoAsDone(true)); + assert!(System::events().iter().any(|a| a.event == expected_event)); + }); +} -- GitLab From 983c389ba5259799abefe9ba9452fe61ebc05aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 13 May 2020 23:53:46 +0200 Subject: [PATCH 042/150] Improve `BadProof` docs (#6019) * Improve `BadProof` docs * Update primitives/runtime/src/transaction_validity.rs Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- primitives/runtime/src/transaction_validity.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/primitives/runtime/src/transaction_validity.rs b/primitives/runtime/src/transaction_validity.rs index 95903b4876..852c0eea3d 100644 --- a/primitives/runtime/src/transaction_validity.rs +++ b/primitives/runtime/src/transaction_validity.rs @@ -43,12 +43,21 @@ pub enum InvalidTransaction { /// General error to do with the transaction being outdated (e.g. nonce too low). Stale, /// General error to do with the transaction's proofs (e.g. signature). + /// + /// # Possible causes + /// + /// When using a signed extension that provides additional data for signing, it is required + /// that the signing and the verifying side use the same additional data. Additional + /// data will only be used to generate the signature, but will not be part of the transaction + /// itself. As the verifying side does not know which additional data was used while signing + /// it will only be able to assume a bad signature and cannot express a more meaningful error. BadProof, /// The transaction birth block is ancient. AncientBirthBlock, /// The transaction would exhaust the resources of current block. /// - /// The transaction might be valid, but there are not enough resources left in the current block. + /// The transaction might be valid, but there are not enough resources + /// left in the current block. ExhaustsResources, /// Any other custom invalid validity that is not covered by this enum. Custom(u8), -- GitLab From f5b441042bc309a8706d345c0abdaeb84d2984ac Mon Sep 17 00:00:00 2001 From: Demi Obenour Date: Wed, 13 May 2020 22:55:24 +0000 Subject: [PATCH 043/150] Fix escaping of the wasm file path (#6018) * Fix escaping of the wasm file path * Add separate methods for escaped paths --- utils/wasm-builder/src/lib.rs | 4 ++-- utils/wasm-builder/src/wasm_project.rs | 15 ++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/utils/wasm-builder/src/lib.rs b/utils/wasm-builder/src/lib.rs index 195527a122..8c80181bb8 100644 --- a/utils/wasm-builder/src/lib.rs +++ b/utils/wasm-builder/src/lib.rs @@ -166,8 +166,8 @@ pub fn build_project_with_default_rustflags( pub const WASM_BINARY: &[u8] = include_bytes!("{wasm_binary}"); pub const WASM_BINARY_BLOATY: &[u8] = include_bytes!("{wasm_binary_bloaty}"); "#, - wasm_binary = wasm_binary.wasm_binary_path(), - wasm_binary_bloaty = bloaty.wasm_binary_bloaty_path(), + wasm_binary = wasm_binary.wasm_binary_path_escaped(), + wasm_binary_bloaty = bloaty.wasm_binary_bloaty_path_escaped(), ), ); } diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index 6248f81935..41e8694b85 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -37,9 +37,9 @@ use itertools::Itertools; pub struct WasmBinaryBloaty(PathBuf); impl WasmBinaryBloaty { - /// Returns the path to the bloaty wasm binary. - pub fn wasm_binary_bloaty_path(&self) -> String { - self.0.display().to_string().replace('\\', "/") + /// Returns the escaped path to the bloaty wasm binary. + pub fn wasm_binary_bloaty_path_escaped(&self) -> String { + self.0.display().to_string().escape_default().to_string() } } @@ -48,8 +48,13 @@ pub struct WasmBinary(PathBuf); impl WasmBinary { /// Returns the path to the wasm binary. - pub fn wasm_binary_path(&self) -> String { - self.0.display().to_string().replace('\\', "/") + pub fn wasm_binary_path(&self) -> &Path { + &self.0 + } + + /// Returns the escaped path to the wasm binary. + pub fn wasm_binary_path_escaped(&self) -> String { + self.0.display().to_string().escape_default().to_string() } } -- GitLab From d016811c79b558faa774fba8d3e9709b9cf6e752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Thu, 14 May 2020 00:01:57 +0100 Subject: [PATCH 044/150] ci: fix merge on polkadot companion job (#6020) --- .maintain/gitlab/check_polkadot_companion_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.maintain/gitlab/check_polkadot_companion_build.sh b/.maintain/gitlab/check_polkadot_companion_build.sh index c2ecf8cb6a..a085076449 100755 --- a/.maintain/gitlab/check_polkadot_companion_build.sh +++ b/.maintain/gitlab/check_polkadot_companion_build.sh @@ -83,12 +83,12 @@ then if [ "${pr_companion}" ] then boldprint "companion pr specified/detected: #${pr_companion}" - git fetch --depth 1 origin refs/pull/${pr_companion}/head:pr/${pr_companion} + git fetch origin refs/pull/${pr_companion}/head:pr/${pr_companion} git checkout pr/${pr_companion} git merge origin/master else pr_ref="$(grep -Po '"ref"\s*:\s*"\K(?!master)[^"]*' "${pr_data_file}")" - if git fetch --depth 1 origin "$pr_ref":branch/"$pr_ref" 2>/dev/null + if git fetch origin "$pr_ref":branch/"$pr_ref" 2>/dev/null then boldprint "companion branch detected: $pr_ref" git checkout branch/"$pr_ref" -- GitLab From b1c61c627cabe60f920cfde2378c4dd2732a9b98 Mon Sep 17 00:00:00 2001 From: s3krit Date: Thu, 14 May 2020 11:06:18 +0200 Subject: [PATCH 045/150] [CI] Fix a few issues with .gitlab-ci.yml (#6016) --- .gitlab-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6814533506..0c06ace76c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -121,7 +121,7 @@ check-signed-tag: image: parity/tools:latest <<: *kubernetes-build only: - - tags + - /^ci-release-.*$/ - /^v[0-9]+\.[0-9]+\.[0-9]+.*$/ script: - ./.maintain/gitlab/check_signed.sh @@ -581,7 +581,7 @@ publish-draft-release: stage: publish image: parity/tools:latest only: - - tags + - /^ci-release-.*$/ - /^v[0-9]+\.[0-9]+\.[0-9]+.*$/ script: - ./.maintain/gitlab/publish_draft_release.sh @@ -592,8 +592,8 @@ publish-to-crates-io: stage: publish <<: *docker-env only: - - tags - /^ci-release-.*$/ + - /^v[0-9]+\.[0-9]+\.[0-9]+.*$/ script: - cargo install cargo-unleash ${CARGO_UNLEASH_INSTALL_PARAMS} - cargo unleash em-dragons --no-check ${CARGO_UNLEASH_PKG_DEF} -- GitLab From 8a8f57d28c32153bf4db783fff46db41e309816a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 14 May 2020 11:08:39 +0200 Subject: [PATCH 046/150] Fix RPC tests for machines with a high number of cores (#6021) --- Cargo.lock | 1 + client/rpc/Cargo.toml | 1 + client/rpc/src/author/tests.rs | 24 +++++++------- client/rpc/src/chain/tests.rs | 58 ++++++++++++---------------------- client/rpc/src/lib.rs | 2 ++ client/rpc/src/state/tests.rs | 52 +++++++++++++----------------- client/rpc/src/testing.rs | 42 ++++++++++++++++++++++++ 7 files changed, 102 insertions(+), 78 deletions(-) create mode 100644 client/rpc/src/testing.rs diff --git a/Cargo.lock b/Cargo.lock index cae4d7c8f2..117497eb32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6611,6 +6611,7 @@ dependencies = [ "hash-db", "jsonrpc-core", "jsonrpc-pubsub", + "lazy_static", "log", "parity-scale-codec", "parking_lot 0.10.2", diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 66f7cb50e6..11ec1dbc9f 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -46,3 +46,4 @@ sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } tokio = "0.1.22" sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } +lazy_static = "1.4.0" diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index de2ee92fe3..d0472abb9b 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -30,7 +30,7 @@ use substrate_test_runtime_client::{ DefaultTestClientBuilderExt, TestClientBuilderExt, Backend, Client, }; use sc_transaction_pool::{BasicPool, FullChainApi}; -use tokio::runtime; +use futures::{executor, compat::Future01CompatExt}; fn uxt(sender: AccountKeyring, nonce: u64) -> Extrinsic { let tx = Transfer { @@ -48,7 +48,6 @@ type FullTransactionPool = BasicPool< >; struct TestSetup { - pub runtime: runtime::Runtime, pub client: Arc>, pub keystore: BareCryptoStorePtr, pub pool: Arc, @@ -68,7 +67,6 @@ impl Default for TestSetup { None, ).0); TestSetup { - runtime: runtime::Runtime::new().expect("Failed to create runtime in test setup"), client, keystore, pool, @@ -81,7 +79,7 @@ impl TestSetup { Author { client: self.client.clone(), pool: self.pool.clone(), - subscriptions: Subscriptions::new(Arc::new(self.runtime.executor())), + subscriptions: Subscriptions::new(Arc::new(crate::testing::TaskExecutor)), keystore: self.keystore.clone(), deny_unsafe: DenyUnsafe::No, } @@ -121,16 +119,20 @@ fn submit_rich_transaction_should_not_cause_error() { #[test] fn should_watch_extrinsic() { //given - let mut setup = TestSetup::default(); + let setup = TestSetup::default(); let p = setup.author(); let (subscriber, id_rx, data) = jsonrpc_pubsub::typed::Subscriber::new_test("test"); // when - p.watch_extrinsic(Default::default(), subscriber, uxt(AccountKeyring::Alice, 0).encode().into()); + p.watch_extrinsic( + Default::default(), + subscriber, + uxt(AccountKeyring::Alice, 0).encode().into(), + ); // then - assert_eq!(setup.runtime.block_on(id_rx), Ok(Ok(1.into()))); + assert_eq!(executor::block_on(id_rx.compat()), Ok(Ok(1.into()))); // check notifications let replacement = { let tx = Transfer { @@ -142,14 +144,14 @@ fn should_watch_extrinsic() { tx.into_signed_tx() }; AuthorApi::submit_extrinsic(&p, replacement.encode().into()).wait().unwrap(); - let (res, data) = setup.runtime.block_on(data.into_future()).unwrap(); + let (res, data) = executor::block_on(data.into_future().compat()).unwrap(); assert_eq!( res, Some(r#"{"jsonrpc":"2.0","method":"test","params":{"result":"ready","subscription":1}}"#.into()) ); let h = blake2_256(&replacement.encode()); assert_eq!( - setup.runtime.block_on(data.into_future()).unwrap().0, + executor::block_on(data.into_future().compat()).unwrap().0, Some(format!(r#"{{"jsonrpc":"2.0","method":"test","params":{{"result":{{"usurped":"0x{}"}},"subscription":1}}}}"#, HexDisplay::from(&h))) ); } @@ -157,7 +159,7 @@ fn should_watch_extrinsic() { #[test] fn should_return_watch_validation_error() { //given - let mut setup = TestSetup::default(); + let setup = TestSetup::default(); let p = setup.author(); let (subscriber, id_rx, _data) = jsonrpc_pubsub::typed::Subscriber::new_test("test"); @@ -166,7 +168,7 @@ fn should_return_watch_validation_error() { p.watch_extrinsic(Default::default(), subscriber, uxt(AccountKeyring::Alice, 179).encode().into()); // then - let res = setup.runtime.block_on(id_rx).unwrap(); + let res = executor::block_on(id_rx.compat()).unwrap(); assert!(res.is_err(), "Expected the transaction to be rejected as invalid."); } diff --git a/client/rpc/src/chain/tests.rs b/client/rpc/src/chain/tests.rs index 68d904919b..b2e6e112a9 100644 --- a/client/rpc/src/chain/tests.rs +++ b/client/rpc/src/chain/tests.rs @@ -23,14 +23,13 @@ use substrate_test_runtime_client::{ }; use sp_rpc::list::ListOrValue; use sc_block_builder::BlockBuilderProvider; +use futures::{executor, compat::{Future01CompatExt, Stream01CompatExt}}; +use crate::testing::TaskExecutor; #[test] fn should_return_header() { - let core = tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); - let client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); assert_matches!( api.header(Some(client.genesis_hash()).into()).wait(), @@ -61,11 +60,8 @@ fn should_return_header() { #[test] fn should_return_a_block() { - let core = tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); - let mut client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); let block = client.new_block(Default::default()).unwrap().build().unwrap().block; let block_hash = block.hash(); @@ -115,11 +111,8 @@ fn should_return_a_block() { #[test] fn should_return_block_hash() { - let core = ::tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); - let mut client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); assert_matches!( api.block_hash(None.into()), @@ -162,11 +155,8 @@ fn should_return_block_hash() { #[test] fn should_return_finalized_hash() { - let core = ::tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); - let mut client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); assert_matches!( api.finalized_head(), @@ -192,76 +182,70 @@ fn should_return_finalized_hash() { #[test] fn should_notify_about_latest_block() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let mut client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); api.subscribe_all_heads(Default::default(), subscriber); // assert id assigned - assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); + assert_eq!(executor::block_on(id.compat()), Ok(Ok(SubscriptionId::Number(1)))); let block = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, block).unwrap(); } // assert initial head sent. - let (notification, next) = core.block_on(transport.into_future()).unwrap(); + let (notification, next) = executor::block_on(transport.into_future().compat()).unwrap(); assert!(notification.is_some()); // assert notification sent to transport - let (notification, next) = core.block_on(next.into_future()).unwrap(); + let (notification, next) = executor::block_on(next.into_future().compat()).unwrap(); assert!(notification.is_some()); // no more notifications on this channel - assert_eq!(core.block_on(next.into_future()).unwrap().0, None); + assert_eq!(executor::block_on(next.into_future().compat()).unwrap().0, None); } #[test] fn should_notify_about_best_block() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let mut client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); api.subscribe_new_heads(Default::default(), subscriber); // assert id assigned - assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); + assert_eq!(executor::block_on(id.compat()), Ok(Ok(SubscriptionId::Number(1)))); let block = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, block).unwrap(); } // assert initial head sent. - let (notification, next) = core.block_on(transport.into_future()).unwrap(); + let (notification, next) = executor::block_on(transport.into_future().compat()).unwrap(); assert!(notification.is_some()); // assert notification sent to transport - let (notification, next) = core.block_on(next.into_future()).unwrap(); + let (notification, next) = executor::block_on(next.into_future().compat()).unwrap(); assert!(notification.is_some()); // no more notifications on this channel - assert_eq!(core.block_on(next.into_future()).unwrap().0, None); + assert_eq!(executor::block_on(Stream01CompatExt::compat(next).into_future()).0, None); } #[test] fn should_notify_about_finalized_block() { - let mut core = ::tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let mut client = Arc::new(substrate_test_runtime_client::new()); - let api = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let api = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); api.subscribe_finalized_heads(Default::default(), subscriber); // assert id assigned - assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); + assert_eq!(executor::block_on(id.compat()), Ok(Ok(SubscriptionId::Number(1)))); let block = client.new_block(Default::default()).unwrap().build().unwrap().block; client.import(BlockOrigin::Own, block).unwrap(); @@ -269,11 +253,11 @@ fn should_notify_about_finalized_block() { } // assert initial head sent. - let (notification, next) = core.block_on(transport.into_future()).unwrap(); + let (notification, next) = executor::block_on(transport.into_future().compat()).unwrap(); assert!(notification.is_some()); // assert notification sent to transport - let (notification, next) = core.block_on(next.into_future()).unwrap(); + let (notification, next) = executor::block_on(next.into_future().compat()).unwrap(); assert!(notification.is_some()); // no more notifications on this channel - assert_eq!(core.block_on(next.into_future()).unwrap().0, None); + assert_eq!(executor::block_on(next.into_future().compat()).unwrap().0, None); } diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index c4389913b4..8d2dd16782 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -31,3 +31,5 @@ pub mod chain; pub mod offchain; pub mod state; pub mod system; +#[cfg(test)] +mod testing; diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index da904f3fdc..f0ac7b2e0f 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -31,6 +31,8 @@ use substrate_test_runtime_client::{ runtime, }; use sp_runtime::generic::BlockId; +use crate::testing::TaskExecutor; +use futures::{executor, compat::Future01CompatExt}; const STORAGE_KEY: &[u8] = b"child"; @@ -46,13 +48,12 @@ fn should_return_storage() { const CHILD_VALUE: &[u8] = b"hello world !"; let child_info = ChildInfo::new_default(STORAGE_KEY); - let mut core = tokio::runtime::Runtime::new().unwrap(); let client = TestClientBuilder::new() .add_extra_storage(KEY.to_vec(), VALUE.to_vec()) .add_extra_child_storage(&child_info, KEY.to_vec(), CHILD_VALUE.to_vec()) .build(); let genesis_hash = client.genesis_hash(); - let (client, child) = new_full(Arc::new(client), Subscriptions::new(Arc::new(core.executor()))); + let (client, child) = new_full(Arc::new(client), Subscriptions::new(Arc::new(TaskExecutor))); let key = StorageKey(KEY.to_vec()); assert_eq!( @@ -70,9 +71,10 @@ fn should_return_storage() { VALUE.len(), ); assert_eq!( - core.block_on( + executor::block_on( child.storage(prefixed_storage_key(), key, Some(genesis_hash).into()) .map(|x| x.map(|x| x.0.len())) + .compat(), ).unwrap().unwrap() as usize, CHILD_VALUE.len(), ); @@ -82,12 +84,11 @@ fn should_return_storage() { #[test] fn should_return_child_storage() { let child_info = ChildInfo::new_default(STORAGE_KEY); - let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(substrate_test_runtime_client::TestClientBuilder::new() .add_child_storage(&child_info, "key", vec![42_u8]) .build()); let genesis_hash = client.genesis_hash(); - let (_client, child) = new_full(client, Subscriptions::new(Arc::new(core.executor()))); + let (_client, child) = new_full(client, Subscriptions::new(Arc::new(TaskExecutor))); let child_key = prefixed_storage_key(); let key = StorageKey(b"key".to_vec()); @@ -120,10 +121,9 @@ fn should_return_child_storage() { #[test] fn should_call_contract() { - let core = tokio::runtime::Runtime::new().unwrap(); let client = Arc::new(substrate_test_runtime_client::new()); let genesis_hash = client.genesis_hash(); - let (client, _child) = new_full(client, Subscriptions::new(Arc::new(core.executor()))); + let (client, _child) = new_full(client, Subscriptions::new(Arc::new(TaskExecutor))); assert_matches!( client.call("balanceOf".into(), Bytes(vec![1,2,3]), Some(genesis_hash).into()).wait(), @@ -133,18 +133,16 @@ fn should_call_contract() { #[test] fn should_notify_about_storage_changes() { - let mut core = tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let mut client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); api.subscribe_storage(Default::default(), subscriber, None.into()); // assert id assigned - assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); + assert_eq!(executor::block_on(id.compat()), Ok(Ok(SubscriptionId::Number(1)))); let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { @@ -158,21 +156,19 @@ fn should_notify_about_storage_changes() { } // assert notification sent to transport - let (notification, next) = core.block_on(transport.into_future()).unwrap(); + let (notification, next) = executor::block_on(transport.into_future().compat()).unwrap(); assert!(notification.is_some()); // no more notifications on this channel - assert_eq!(core.block_on(next.into_future()).unwrap().0, None); + assert_eq!(executor::block_on(next.into_future().compat()).unwrap().0, None); } #[test] fn should_send_initial_storage_changes_and_notifications() { - let mut core = tokio::runtime::Runtime::new().unwrap(); - let remote = core.executor(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let mut client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(remote))); + let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); let alice_balance_key = blake2_256(&runtime::system::balance_of_key(AccountKeyring::Alice.into())); @@ -181,7 +177,7 @@ fn should_send_initial_storage_changes_and_notifications() { ]).into()); // assert id assigned - assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); + assert_eq!(executor::block_on(id.compat()), Ok(Ok(SubscriptionId::Number(1)))); let mut builder = client.new_block(Default::default()).unwrap(); builder.push_transfer(runtime::Transfer { @@ -195,20 +191,19 @@ fn should_send_initial_storage_changes_and_notifications() { } // assert initial values sent to transport - let (notification, next) = core.block_on(transport.into_future()).unwrap(); + let (notification, next) = executor::block_on(transport.into_future().compat()).unwrap(); assert!(notification.is_some()); // assert notification sent to transport - let (notification, next) = core.block_on(next.into_future()).unwrap(); + let (notification, next) = executor::block_on(next.into_future().compat()).unwrap(); assert!(notification.is_some()); // no more notifications on this channel - assert_eq!(core.block_on(next.into_future()).unwrap().0, None); + assert_eq!(executor::block_on(next.into_future().compat()).unwrap().0, None); } #[test] fn should_query_storage() { fn run_tests(mut client: Arc, has_changes_trie_config: bool) { - let core = tokio::runtime::Runtime::new().unwrap(); - let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(core.executor()))); + let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); let mut add_block = |nonce| { let mut builder = client.new_block(Default::default()).unwrap(); @@ -424,10 +419,8 @@ fn should_split_ranges() { #[test] fn should_return_runtime_version() { - let core = tokio::runtime::Runtime::new().unwrap(); - let client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(core.executor()))); + let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); let result = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":1,\ \"specVersion\":2,\"implVersion\":2,\"apis\":[[\"0xdf6acb689907609b\",3],\ @@ -446,24 +439,23 @@ fn should_return_runtime_version() { #[test] fn should_notify_on_runtime_version_initially() { - let mut core = tokio::runtime::Runtime::new().unwrap(); let (subscriber, id, transport) = Subscriber::new_test("test"); { let client = Arc::new(substrate_test_runtime_client::new()); - let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(core.executor()))); + let (api, _child) = new_full(client.clone(), Subscriptions::new(Arc::new(TaskExecutor))); api.subscribe_runtime_version(Default::default(), subscriber); // assert id assigned - assert_eq!(core.block_on(id), Ok(Ok(SubscriptionId::Number(1)))); + assert_eq!(executor::block_on(id.compat()), Ok(Ok(SubscriptionId::Number(1)))); } // assert initial version sent. - let (notification, next) = core.block_on(transport.into_future()).unwrap(); + let (notification, next) = executor::block_on(transport.into_future().compat()).unwrap(); assert!(notification.is_some()); // no more notifications on this channel - assert_eq!(core.block_on(next.into_future()).unwrap().0, None); + assert_eq!(executor::block_on(next.into_future().compat()).unwrap().0, None); } #[test] diff --git a/client/rpc/src/testing.rs b/client/rpc/src/testing.rs new file mode 100644 index 0000000000..fecef568a9 --- /dev/null +++ b/client/rpc/src/testing.rs @@ -0,0 +1,42 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Testing utils used by the RPC tests. + +use rpc::futures::future as future01; +use futures::{executor, compat::Future01CompatExt, FutureExt}; + +// Executor shared by all tests. +// +// This shared executor is used to prevent `Too many open files` errors +// on systems with a lot of cores. +lazy_static::lazy_static! { + static ref EXECUTOR: executor::ThreadPool = executor::ThreadPool::new() + .expect("Failed to create thread pool executor for tests"); +} + +type Boxed01Future01 = Box + Send + 'static>; + +pub struct TaskExecutor; +impl future01::Executor for TaskExecutor { + fn execute( + &self, + future: Boxed01Future01, + ) -> std::result::Result<(), future01::ExecuteError>{ + EXECUTOR.spawn_ok(future.compat().map(drop)); + Ok(()) + } +} -- GitLab From 34567133e7666dfb1e49ce7e3565e66a7e5f9542 Mon Sep 17 00:00:00 2001 From: Alexander Popiak Date: Thu, 14 May 2020 17:20:03 +0200 Subject: [PATCH 047/150] Collective weights (#5802) --- Cargo.lock | 1 + bin/node/runtime/Cargo.toml | 1 + bin/node/runtime/src/lib.rs | 14 +- frame/collective/src/benchmarking.rs | 447 ++++++++++++----- frame/collective/src/lib.rs | 707 +++++++++++++++++++++++---- 5 files changed, 945 insertions(+), 225 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 117497eb32..0060543e01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3656,6 +3656,7 @@ dependencies = [ "sp-std", "sp-transaction-pool", "sp-version", + "static_assertions", "substrate-wasm-builder-runner", ] diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 00d1c6dd72..bae21fd6c8 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -17,6 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } integer-sqrt = { version = "0.1.2" } serde = { version = "1.0.102", optional = true } +static_assertions = "1.1.0" # primitives sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/authority-discovery" } diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 64b4cc0e64..1eec930dfb 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -58,6 +58,8 @@ use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; use pallet_contracts_rpc_runtime_api::ContractExecResult; use pallet_session::{historical as pallet_session_historical}; use sp_inherents::{InherentData, CheckInherentsResult}; +use codec::Encode; +use static_assertions::const_assert; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -67,7 +69,6 @@ pub use frame_system::Call as SystemCall; pub use pallet_contracts::Gas; pub use frame_support::StorageValue; pub use pallet_staking::StakerStatus; -use codec::Encode; /// Implementations of some helper traits passed into runtime modules as associated types. pub mod impls; @@ -90,7 +91,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 247, + spec_version: 248, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -377,6 +378,7 @@ impl pallet_democracy::Trait for Runtime { parameter_types! { pub const CouncilMotionDuration: BlockNumber = 5 * DAYS; + pub const CouncilMaxProposals: u32 = 100; } type CouncilCollective = pallet_collective::Instance1; @@ -385,16 +387,20 @@ impl pallet_collective::Trait for Runtime { type Proposal = Call; type Event = Event; type MotionDuration = CouncilMotionDuration; + type MaxProposals = CouncilMaxProposals; } +const DESIRED_MEMBERS: u32 = 13; parameter_types! { pub const CandidacyBond: Balance = 10 * DOLLARS; pub const VotingBond: Balance = 1 * DOLLARS; pub const TermDuration: BlockNumber = 7 * DAYS; - pub const DesiredMembers: u32 = 13; + pub const DesiredMembers: u32 = DESIRED_MEMBERS; pub const DesiredRunnersUp: u32 = 7; pub const ElectionsPhragmenModuleId: LockIdentifier = *b"phrelect"; } +// Make sure that there are no more than `MAX_MEMBERS` members elected via phragmen. +const_assert!(DESIRED_MEMBERS <= pallet_collective::MAX_MEMBERS); impl pallet_elections_phragmen::Trait for Runtime { type ModuleId = ElectionsPhragmenModuleId; @@ -417,6 +423,7 @@ impl pallet_elections_phragmen::Trait for Runtime { parameter_types! { pub const TechnicalMotionDuration: BlockNumber = 5 * DAYS; + pub const TechnicalMaxProposals: u32 = 100; } type TechnicalCollective = pallet_collective::Instance2; @@ -425,6 +432,7 @@ impl pallet_collective::Trait for Runtime { type Proposal = Call; type Event = Event; type MotionDuration = TechnicalMotionDuration; + type MaxProposals = TechnicalMaxProposals; } impl pallet_membership::Trait for Runtime { diff --git a/frame/collective/src/benchmarking.rs b/frame/collective/src/benchmarking.rs index 5c25051fd0..77473abef4 100644 --- a/frame/collective/src/benchmarking.rs +++ b/frame/collective/src/benchmarking.rs @@ -22,14 +22,14 @@ use frame_system::RawOrigin as SystemOrigin; use frame_system::EventRecord; use frame_benchmarking::{benchmarks_instance, account}; use sp_runtime::traits::Bounded; +use sp_std::mem::size_of; +use frame_system::Call as SystemCall; use frame_system::Module as System; use crate::Module as Collective; const SEED: u32 = 0; -const MAX_MEMBERS: u32 = 1000; -const MAX_PROPOSALS: u32 = 100; const MAX_BYTES: u32 = 1_024; fn assert_last_event, I: Instance>(generic_event: >::Event) { @@ -46,28 +46,64 @@ benchmarks_instance! { set_members { let m in 1 .. MAX_MEMBERS; let n in 1 .. MAX_MEMBERS; + let p in 1 .. T::MaxProposals::get(); // Set old members. // We compute the difference of old and new members, so it should influence timing. let mut old_members = vec![]; let mut last_old_member = T::AccountId::default(); - for i in 0 .. n { + for i in 0 .. m { last_old_member = account("old member", i, SEED); old_members.push(last_old_member.clone()); } + let old_members_count = old_members.len() as u32; - Collective::::set_members(SystemOrigin::Root.into(), old_members, Some(last_old_member))?; + Collective::::set_members( + SystemOrigin::Root.into(), + old_members.clone(), + Some(last_old_member.clone()), + MAX_MEMBERS, + )?; + + // Set a high threshold for proposals passing so that they stay around. + let threshold = m.max(2); + // Length of the proposals should be irrelevant to `set_members`. + let length = 100; + for i in 0 .. p { + // Proposals should be different so that different proposal hashes are generated + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; length]).into(); + Collective::::propose( + SystemOrigin::Signed(last_old_member.clone()).into(), + threshold, + Box::new(proposal.clone()), + MAX_BYTES, + )?; + let hash = T::Hashing::hash_of(&proposal); + // Vote on the proposal to increase state relevant for `set_members`. + // Not voting for `last_old_member` because they proposed and not voting for the first member + // to keep the proposal from passing. + for j in 2 .. m - 1 { + let voter = &old_members[j as usize]; + let approve = true; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + hash, + i, + approve, + )?; + } + } // Construct `new_members`. // It should influence timing since it will sort this vector. let mut new_members = vec![]; let mut last_member = T::AccountId::default(); - for i in 0 .. m { + for i in 0 .. n { last_member = account("member", i, SEED); new_members.push(last_member.clone()); } - }: _(SystemOrigin::Root, new_members.clone(), Some(last_member)) + }: _(SystemOrigin::Root, new_members.clone(), Some(last_member), MAX_MEMBERS) verify { new_members.sort(); assert_eq!(Collective::::members(), new_members); @@ -77,9 +113,11 @@ benchmarks_instance! { let m in 1 .. MAX_MEMBERS; let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + for i in 0 .. m - 1 { let member = account("member", i, SEED); members.push(member); } @@ -87,15 +125,17 @@ benchmarks_instance! { let caller: T::AccountId = account("caller", 0, SEED); members.push(caller.clone()); - Collective::::set_members(SystemOrigin::Root.into(), members, None)?; + Collective::::set_members(SystemOrigin::Root.into(), members, None, MAX_MEMBERS)?; - let proposal: T::Proposal = frame_system::Call::::remark(vec![1; b as usize]).into(); + let proposal: T::Proposal = SystemCall::::remark(vec![1; b as usize]).into(); - }: _(SystemOrigin::Signed(caller), Box::new(proposal.clone())) + }: _(SystemOrigin::Signed(caller), Box::new(proposal.clone()), bytes_in_storage) verify { let proposal_hash = T::Hashing::hash_of(&proposal); // Note that execution fails due to mis-matched origin - assert_last_event::(RawEvent::MemberExecuted(proposal_hash, false).into()); + assert_last_event::( + RawEvent::MemberExecuted(proposal_hash, Err(DispatchError::BadOrigin)).into() + ); } // This tests when execution would happen immediately after proposal @@ -103,9 +143,11 @@ benchmarks_instance! { let m in 1 .. MAX_MEMBERS; let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + for i in 0 .. m - 1 { let member = account("member", i, SEED); members.push(member); } @@ -113,169 +155,230 @@ benchmarks_instance! { let caller: T::AccountId = account("caller", 0, SEED); members.push(caller.clone()); - Collective::::set_members(SystemOrigin::Root.into(), members, None)?; + Collective::::set_members(SystemOrigin::Root.into(), members, None, MAX_MEMBERS)?; - let proposal: T::Proposal = frame_system::Call::::remark(vec![1; b as usize]).into(); + let proposal: T::Proposal = SystemCall::::remark(vec![1; b as usize]).into(); let threshold = 1; - }: propose(SystemOrigin::Signed(caller), threshold, Box::new(proposal.clone())) + }: propose(SystemOrigin::Signed(caller), threshold, Box::new(proposal.clone()), bytes_in_storage) verify { let proposal_hash = T::Hashing::hash_of(&proposal); // Note that execution fails due to mis-matched origin - assert_last_event::(RawEvent::Executed(proposal_hash, false).into()); + assert_last_event::( + RawEvent::Executed(proposal_hash, Err(DispatchError::BadOrigin)).into() + ); } // This tests when proposal is created and queued as "proposed" propose_proposed { - let m in 1 .. MAX_MEMBERS; - let p in 0 .. MAX_PROPOSALS; + let m in 2 .. MAX_MEMBERS; + let p in 1 .. T::MaxProposals::get(); let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + for i in 0 .. m - 1 { let member = account("member", i, SEED); members.push(member); } - let caller: T::AccountId = account("caller", 0, SEED); members.push(caller.clone()); - Collective::::set_members(SystemOrigin::Root.into(), members, None)?; - - let threshold = m.max(2); + Collective::::set_members(SystemOrigin::Root.into(), members, None, MAX_MEMBERS)?; + let threshold = m; // Add previous proposals. - for i in 0 .. p { + for i in 0 .. p - 1 { // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = frame_system::Call::::remark(vec![i as u8; b as usize]).into(); - Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), threshold, Box::new(proposal))?; + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; b as usize]).into(); + Collective::::propose( + SystemOrigin::Signed(caller.clone()).into(), + threshold, + Box::new(proposal), + bytes_in_storage, + )?; } - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Collective::::proposals().len(), (p - 1) as usize); - let proposal: T::Proposal = frame_system::Call::::remark(vec![p as u8; b as usize]).into(); + let proposal: T::Proposal = SystemCall::::remark(vec![p as u8; b as usize]).into(); - }: propose(SystemOrigin::Signed(caller.clone()), threshold, Box::new(proposal.clone())) + }: propose(SystemOrigin::Signed(caller.clone()), threshold, Box::new(proposal.clone()), bytes_in_storage) verify { // New proposal is recorded - assert_eq!(Collective::::proposals().len(), (p + 1) as usize); + assert_eq!(Collective::::proposals().len(), p as usize); let proposal_hash = T::Hashing::hash_of(&proposal); - assert_last_event::(RawEvent::Proposed(caller, p, proposal_hash, threshold).into()); + assert_last_event::(RawEvent::Proposed(caller, p - 1, proposal_hash, threshold).into()); } - vote_insert { - let m in 2 .. MAX_MEMBERS; - let p in 1 .. MAX_PROPOSALS; - let b in 1 .. MAX_BYTES; + vote { + // We choose 5 as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let m in 5 .. MAX_MEMBERS; + + let p = T::MaxProposals::get(); + let b = MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + let proposer: T::AccountId = account("proposer", 0, SEED); + members.push(proposer.clone()); + for i in 1 .. m - 1 { let member = account("member", i, SEED); members.push(member); } - - let caller: T::AccountId = account("caller", 0, SEED); - members.push(caller.clone()); - Collective::::set_members(SystemOrigin::Root.into(), members.clone(), None)?; + let voter: T::AccountId = account("voter", 0, SEED); + members.push(voter.clone()); + Collective::::set_members(SystemOrigin::Root.into(), members.clone(), None, MAX_MEMBERS)?; // Threshold is 1 less than the number of members so that one person can vote nay - let threshold = m; + let threshold = m - 1; // Add previous proposals let mut last_hash = T::Hash::default(); for i in 0 .. p { // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = frame_system::Call::::remark(vec![i as u8; b as usize]).into(); - Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), threshold, Box::new(proposal.clone()))?; + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; b as usize]).into(); + Collective::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; last_hash = T::Hashing::hash_of(&proposal); } - // Have everyone vote aye on last proposal, while keeping it from passing - for j in 2 .. m { + let index = p - 1; + // Have almost everyone vote aye on last proposal, while keeping it from passing. + // Proposer already voted aye so we start at 1. + for j in 1 .. m - 3 { let voter = &members[j as usize]; let approve = true; - Collective::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash.clone(), p - 1, approve)?; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + approve, + )?; } + // Voter votes aye without resolving the vote. + let approve = true; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + approve, + )?; assert_eq!(Collective::::proposals().len(), p as usize); - // Caller switches vote to nay, but does not kill the vote, just updates + inserts - let index = p - 1; + // Voter switches vote to nay, but does not kill the vote, just updates + inserts let approve = false; - }: vote(SystemOrigin::Signed(caller), last_hash.clone(), index, approve) + }: _(SystemOrigin::Signed(voter), last_hash.clone(), index, approve) verify { // All proposals exist and the last proposal has just been updated. assert_eq!(Collective::::proposals().len(), p as usize); let voting = Collective::::voting(&last_hash).ok_or(Error::::ProposalMissing)?; - assert_eq!(voting.ayes.len(), (m - 2) as usize); + assert_eq!(voting.ayes.len(), (m - 3) as usize); assert_eq!(voting.nays.len(), 1); } - vote_disapproved { - let m in 2 .. MAX_MEMBERS; - let p in 1 .. MAX_PROPOSALS; + close_early_disapproved { + // We choose 4 as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let m in 4 .. MAX_MEMBERS; + let p in 1 .. T::MaxProposals::get(); let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + let proposer: T::AccountId = account("proposer", 0, SEED); + members.push(proposer.clone()); + for i in 1 .. m - 1 { let member = account("member", i, SEED); members.push(member); } - - let caller: T::AccountId = account("caller", 0, SEED); - members.push(caller.clone()); - Collective::::set_members(SystemOrigin::Root.into(), members.clone(), None)?; + let voter: T::AccountId = account("voter", 0, SEED); + members.push(voter.clone()); + Collective::::set_members(SystemOrigin::Root.into(), members.clone(), None, MAX_MEMBERS)?; // Threshold is total members so that one nay will disapprove the vote - let threshold = m + 1; + let threshold = m; // Add previous proposals let mut last_hash = T::Hash::default(); for i in 0 .. p { // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = frame_system::Call::::remark(vec![i as u8; b as usize]).into(); - Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), threshold, Box::new(proposal.clone()))?; + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; b as usize]).into(); + Collective::::propose( + SystemOrigin::Signed(proposer.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; last_hash = T::Hashing::hash_of(&proposal); } - // Have everyone vote aye on last proposal, while keeping it from passing - for j in 1 .. m { + let index = p - 1; + // Have most everyone vote aye on last proposal, while keeping it from passing. + // Proposer already voted aye so we start at 1. + for j in 1 .. m - 2 { let voter = &members[j as usize]; let approve = true; - Collective::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash.clone(), p - 1, approve)?; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + approve, + )?; } + // Voter votes aye without resolving the vote. + let approve = true; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + approve, + )?; assert_eq!(Collective::::proposals().len(), p as usize); - // Caller switches vote to nay, which kills the vote - let index = p - 1; + // Voter switches vote to nay, which kills the vote let approve = false; - - }: vote(SystemOrigin::Signed(caller), last_hash.clone(), index, approve) + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + approve, + )?; + + }: close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::max_value(), bytes_in_storage) verify { // The last proposal is removed. assert_eq!(Collective::::proposals().len(), (p - 1) as usize); assert_last_event::(RawEvent::Disapproved(last_hash).into()); } - vote_approved { - let m in 2 .. MAX_MEMBERS; - let p in 1 .. MAX_PROPOSALS; + close_early_approved { + // We choose 4 as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let m in 4 .. MAX_MEMBERS; + let p in 1 .. T::MaxProposals::get(); let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + for i in 0 .. m - 1 { let member = account("member", i, SEED); members.push(member); } - let caller: T::AccountId = account("caller", 0, SEED); members.push(caller.clone()); - Collective::::set_members(SystemOrigin::Root.into(), members.clone(), None)?; + Collective::::set_members(SystemOrigin::Root.into(), members.clone(), None, MAX_MEMBERS)?; // Threshold is 2 so any two ayes will approve the vote let threshold = 2; @@ -284,102 +387,156 @@ benchmarks_instance! { let mut last_hash = T::Hash::default(); for i in 0 .. p { // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = frame_system::Call::::remark(vec![i as u8; b as usize]).into(); - Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), threshold, Box::new(proposal.clone()))?; + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; b as usize]).into(); + Collective::::propose( + SystemOrigin::Signed(caller.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; last_hash = T::Hashing::hash_of(&proposal); } // Caller switches vote to nay on their own proposal, allowing them to be the deciding approval vote - Collective::::vote(SystemOrigin::Signed(caller.clone()).into(), last_hash.clone(), p - 1, false)?; - - // Have everyone vote nay on last proposal, while keeping it from failing - for j in 2 .. m { + Collective::::vote( + SystemOrigin::Signed(caller.clone()).into(), + last_hash.clone(), + p - 1, + false, + )?; + + // Have almost everyone vote nay on last proposal, while keeping it from failing. + for j in 2 .. m - 1 { let voter = &members[j as usize]; let approve = false; - Collective::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash.clone(), p - 1, approve)?; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + p - 1, + approve, + )?; } // Member zero is the first aye - Collective::::vote(SystemOrigin::Signed(members[0].clone()).into(), last_hash.clone(), p - 1, true)?; + Collective::::vote( + SystemOrigin::Signed(members[0].clone()).into(), + last_hash.clone(), + p - 1, + true, + )?; assert_eq!(Collective::::proposals().len(), p as usize); // Caller switches vote to aye, which passes the vote let index = p - 1; let approve = true; + Collective::::vote( + SystemOrigin::Signed(caller.clone()).into(), + last_hash.clone(), + index, approve, + )?; - }: vote(SystemOrigin::Signed(caller), last_hash.clone(), index, approve) + }: close(SystemOrigin::Signed(caller), last_hash.clone(), index, Weight::max_value(), bytes_in_storage) verify { // The last proposal is removed. assert_eq!(Collective::::proposals().len(), (p - 1) as usize); - assert_last_event::(RawEvent::Executed(last_hash, false).into()); + assert_last_event::(RawEvent::Executed(last_hash, Err(DispatchError::BadOrigin)).into()); } close_disapproved { - let m in 2 .. MAX_MEMBERS; - let p in 1 .. MAX_PROPOSALS; + // We choose 4 as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let m in 4 .. MAX_MEMBERS; + let p in 1 .. T::MaxProposals::get(); let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + for i in 0 .. m - 1 { let member = account("member", i, SEED); members.push(member); } let caller: T::AccountId = account("caller", 0, SEED); members.push(caller.clone()); - - Collective::::set_members(SystemOrigin::Root.into(), members.clone(), Some(caller.clone()))?; + Collective::::set_members( + SystemOrigin::Root.into(), + members.clone(), + Some(caller.clone()), + MAX_MEMBERS, + )?; // Threshold is one less than total members so that two nays will disapprove the vote - let threshold = m; + let threshold = m - 1; // Add proposals let mut last_hash = T::Hash::default(); for i in 0 .. p { // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = frame_system::Call::::remark(vec![i as u8; b as usize]).into(); - Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), threshold, Box::new(proposal.clone()))?; + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; b as usize]).into(); + Collective::::propose( + SystemOrigin::Signed(caller.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; last_hash = T::Hashing::hash_of(&proposal); } - // Have everyone vote aye on last proposal, while keeping it from passing - // A few abstainers will be the nay votes needed to fail the vote - for j in 2 .. m { + let index = p - 1; + // Have almost everyone vote aye on last proposal, while keeping it from passing. + // A few abstainers will be the nay votes needed to fail the vote. + for j in 2 .. m - 1 { let voter = &members[j as usize]; let approve = true; - Collective::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash.clone(), p - 1, approve)?; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + index, + approve, + )?; } // caller is prime, prime votes nay - Collective::::vote(SystemOrigin::Signed(caller.clone()).into(), last_hash.clone(), p - 1, false)?; + Collective::::vote( + SystemOrigin::Signed(caller.clone()).into(), + last_hash.clone(), + index, + false, + )?; System::::set_block_number(T::BlockNumber::max_value()); assert_eq!(Collective::::proposals().len(), p as usize); // Prime nay will close it as disapproved - }: close(SystemOrigin::Signed(caller), last_hash, p - 1) + }: close(SystemOrigin::Signed(caller), last_hash, index, Weight::max_value(), bytes_in_storage) verify { assert_eq!(Collective::::proposals().len(), (p - 1) as usize); assert_last_event::(RawEvent::Disapproved(last_hash).into()); } - close_approved { - let m in 2 .. MAX_MEMBERS; - let p in 1 .. MAX_PROPOSALS; + // We choose 4 as a minimum so we always trigger a vote in the voting loop (`for j in ...`) + let m in 4 .. MAX_MEMBERS; + let p in 1 .. T::MaxProposals::get(); let b in 1 .. MAX_BYTES; + let bytes_in_storage = b + size_of::() as u32; + // Construct `members`. let mut members = vec![]; - for i in 0 .. m { + for i in 0 .. m - 1 { let member = account("member", i, SEED); members.push(member); } let caller: T::AccountId = account("caller", 0, SEED); members.push(caller.clone()); - - Collective::::set_members(SystemOrigin::Root.into(), members.clone(), Some(caller.clone()))?; + Collective::::set_members( + SystemOrigin::Root.into(), + members.clone(), + Some(caller.clone()), + MAX_MEMBERS, + )?; // Threshold is two, so any two ayes will pass the vote let threshold = 2; @@ -388,17 +545,27 @@ benchmarks_instance! { let mut last_hash = T::Hash::default(); for i in 0 .. p { // Proposals should be different so that different proposal hashes are generated - let proposal: T::Proposal = frame_system::Call::::remark(vec![i as u8; b as usize]).into(); - Collective::::propose(SystemOrigin::Signed(caller.clone()).into(), threshold, Box::new(proposal.clone()))?; + let proposal: T::Proposal = SystemCall::::remark(vec![i as u8; b as usize]).into(); + Collective::::propose( + SystemOrigin::Signed(caller.clone()).into(), + threshold, + Box::new(proposal.clone()), + bytes_in_storage, + )?; last_hash = T::Hashing::hash_of(&proposal); } - // Have everyone vote nay on last proposal, while keeping it from failing - // A few abstainers will be the aye votes needed to pass the vote - for j in 2 .. m { + // Have almost everyone vote nay on last proposal, while keeping it from failing. + // A few abstainers will be the aye votes needed to pass the vote. + for j in 2 .. m - 1 { let voter = &members[j as usize]; let approve = false; - Collective::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash.clone(), p - 1, approve)?; + Collective::::vote( + SystemOrigin::Signed(voter.clone()).into(), + last_hash.clone(), + p - 1, + approve + )?; } // caller is prime, prime already votes aye by creating the proposal @@ -406,10 +573,10 @@ benchmarks_instance! { assert_eq!(Collective::::proposals().len(), p as usize); // Prime aye will close it as approved - }: close(SystemOrigin::Signed(caller), last_hash, p - 1) + }: close(SystemOrigin::Signed(caller), last_hash, p - 1, Weight::max_value(), bytes_in_storage) verify { assert_eq!(Collective::::proposals().len(), (p - 1) as usize); - assert_last_event::(RawEvent::Executed(last_hash, false).into()); + assert_last_event::(RawEvent::Executed(last_hash, Err(DispatchError::BadOrigin)).into()); } } @@ -420,16 +587,64 @@ mod tests { use frame_support::assert_ok; #[test] - fn test_benchmarks() { + fn set_members() { new_test_ext().execute_with(|| { assert_ok!(test_benchmark_set_members::()); + }); + } + + #[test] + fn execute() { + new_test_ext().execute_with(|| { assert_ok!(test_benchmark_execute::()); + }); + } + + #[test] + fn propose_execute() { + new_test_ext().execute_with(|| { assert_ok!(test_benchmark_propose_execute::()); + }); + } + + #[test] + fn propose_proposed() { + new_test_ext().execute_with(|| { assert_ok!(test_benchmark_propose_proposed::()); - assert_ok!(test_benchmark_vote_insert::()); - assert_ok!(test_benchmark_vote_disapproved::()); - assert_ok!(test_benchmark_vote_approved::()); + }); + } + + #[test] + fn vote() { + new_test_ext().execute_with(|| { + assert_ok!(test_benchmark_vote::()); + }); + } + + #[test] + fn close_early_disapproved() { + new_test_ext().execute_with(|| { + assert_ok!(test_benchmark_close_early_disapproved::()); + }); + } + + #[test] + fn close_early_approved() { + new_test_ext().execute_with(|| { + assert_ok!(test_benchmark_close_early_approved::()); + }); + } + + #[test] + fn close_disapproved() { + new_test_ext().execute_with(|| { assert_ok!(test_benchmark_close_disapproved::()); + }); + } + + #[test] + fn close_approved() { + new_test_ext().execute_with(|| { assert_ok!(test_benchmark_close_approved::()); }); } diff --git a/frame/collective/src/lib.rs b/frame/collective/src/lib.rs index 662465616e..31c93bf71d 100644 --- a/frame/collective/src/lib.rs +++ b/frame/collective/src/lib.rs @@ -19,6 +19,8 @@ //! //! The membership can be provided in one of two ways: either directly, using the Root-dispatchable //! function `set_members`, or indirectly, through implementing the `ChangeMembers`. +//! The pallet assumes that the amount of members stays at or below `MAX_MEMBERS` for its weight +//! calculations, but enforces this neither in `set_members` nor in `change_members_sorted`. //! //! A "prime" member may be set allowing their vote to act as the default vote in case of any //! abstentions after the voting period. @@ -38,13 +40,19 @@ use sp_std::{prelude::*, result}; use sp_core::u32_trait::Value as U32; -use sp_runtime::RuntimeDebug; -use sp_runtime::traits::Hash; +use sp_io::storage; +use sp_runtime::{RuntimeDebug, traits::Hash}; + use frame_support::{ - dispatch::{Dispatchable, Parameter}, codec::{Encode, Decode}, - traits::{Get, ChangeMembers, InitializeMembers, EnsureOrigin}, decl_module, decl_event, - decl_storage, decl_error, ensure, - weights::DispatchClass, + codec::{Decode, Encode}, + debug, decl_error, decl_event, decl_module, decl_storage, + dispatch::{ + DispatchError, DispatchResult, DispatchResultWithPostInfo, Dispatchable, Parameter, + PostDispatchInfo, + }, + ensure, + traits::{ChangeMembers, EnsureOrigin, Get, InitializeMembers}, + weights::{DispatchClass, GetDispatchInfo, Weight}, }; use frame_system::{self as system, ensure_signed, ensure_root}; @@ -60,18 +68,31 @@ pub type ProposalIndex = u32; /// vote exactly once, therefore also the number of votes for any given motion. pub type MemberCount = u32; +/// The maximum number of members supported by the pallet. Used for weight estimation. +/// +/// NOTE: +/// + Benchmarks will need to be re-run and weights adjusted if this changes. +/// + This pallet assumes that dependents keep to the limit without enforcing it. +pub const MAX_MEMBERS: MemberCount = 100; + pub trait Trait: frame_system::Trait { /// The outer origin type. type Origin: From>; /// The outer call dispatch type. - type Proposal: Parameter + Dispatchable>::Origin> + From>; + type Proposal: Parameter + + Dispatchable>::Origin, PostInfo=PostDispatchInfo> + + From> + + GetDispatchInfo; /// The outer event type. type Event: From> + Into<::Event>; /// The time-out for council motions. type MotionDuration: Get; + + /// Maximum number of proposals allowed to be active in parallel. + type MaxProposals: Get; } /// Origin for the collective module. @@ -144,9 +165,9 @@ decl_event! { /// A motion was not approved by the required threshold. Disapproved(Hash), /// A motion was executed; `bool` is true if returned without error. - Executed(Hash, bool), + Executed(Hash, DispatchResult), /// A single member did some action; `bool` is true if returned without error. - MemberExecuted(Hash, bool), + MemberExecuted(Hash, DispatchResult), /// A proposal was closed after its duration was up. Closed(Hash, MemberCount, MemberCount), } @@ -168,12 +189,152 @@ decl_error! { AlreadyInitialized, /// The close call is made too early, before the end of the voting. TooEarly, + /// There can only be a maximum of `MaxProposals` active proposals. + TooManyProposals, + /// The given weight bound for the proposal was too low. + WrongProposalWeight, + /// The given length bound for the proposal was too low. + WrongProposalLength, + } +} + +/// Functions for calcuating the weight of dispatchables. +mod weight_for { + use frame_support::{traits::Get, weights::Weight}; + use super::{Trait, Instance}; + + /// Calculate the weight for `set_members`. + /// + /// Based on benchmark: + /// 0 + M * 20.47 + N * 0.109 + P * 26.29 µs (min squares analysis) + /// + /// Note: The complexity of `set_members` is quadratic (`O(MP + N)`), so the linear approximation + /// of the benchmark is not always permissible. It is here, though, because the linear approximation + /// covered the range of possible values and we estimate weight via the worst case (max paramter + /// values) before execution so we can be sure that we are only overestimating. + pub(crate) fn set_members, I: Instance>( + old_count: Weight, + new_count: Weight, + proposals: Weight, + ) -> Weight { + let db = T::DbWeight::get(); + db.reads_writes(1, 1) // mutate `Members` + .saturating_add(db.writes(1)) // set `Prime` + .saturating_add(db.reads(1)) // read `Proposals` + .saturating_add(db.reads_writes(proposals, proposals)) // update votes (`Voting`) + .saturating_add(old_count.saturating_mul(21_000_000)) // M + .saturating_add(new_count.saturating_mul(110_000)) // N + .saturating_add(proposals.saturating_mul(27_000_000)) // P + } + + /// Calculate the weight for `execute`. + /// + /// Based on benchmark: + /// 22.62 + M * 0.115 + B * 0.003 µs (min squares analysis) + pub(crate) fn execute, I: Instance>( + members: Weight, + proposal: Weight, + length: Weight, + ) -> Weight { + T::DbWeight::get().reads(1) // read members for `is_member` + .saturating_add(23_000_000) // constant + .saturating_add(length.saturating_mul(4_000)) // B + .saturating_add(members.saturating_mul(120_000)) // M + .saturating_add(proposal) // P + } + + /// Calculate the weight for `propose` if the proposal is executed straight away (`threshold < 2`). + /// + /// Based on benchmark: + /// 28.12 + M * 0.218 + B * 0.003 µs (min squares analysis) + pub(crate) fn propose_execute, I: Instance>( + members: Weight, + proposal: Weight, + length: Weight, + ) -> Weight { + T::DbWeight::get().reads(2) // `is_member` + `contains_key` + .saturating_add(29_000_000) // constant + .saturating_add(length.saturating_mul(3_000)) // B + .saturating_add(members.saturating_mul(220_000)) // M + .saturating_add(proposal) // P1 + } + + /// Calculate the weight for `propose` if the proposal is put up for a vote (`threshold >= 2`). + /// + /// Based on benchmark: + /// 49.75 + M * 0.105 + P2 0.502 + B * 0.006 µs (min squares analysis) + pub(crate) fn propose_proposed, I: Instance>( + members: Weight, + proposals: Weight, + length: Weight, + ) -> Weight { + T::DbWeight::get().reads(2) // `is_member` + `contains_key` + .saturating_add(T::DbWeight::get().reads_writes(2, 4)) // `proposal` insertion + .saturating_add(50_000_000) // constant + .saturating_add(length.saturating_mul(6_000)) // B + .saturating_add(members.saturating_mul(110_000)) // M + .saturating_add(proposals.saturating_mul(510_000)) // P2 + } + + /// Calculate the weight for `vote`. + /// + /// Based on benchmark: + /// 24.03 + M * 0.349 + P * 0.119 + B * 0.003 µs (min squares analysis) + pub(crate) fn vote, I: Instance>( + members: Weight, + ) -> Weight { + T::DbWeight::get().reads(1) // read `Members` + .saturating_add(T::DbWeight::get().reads_writes(1, 1)) // mutate `Voting` + .saturating_add(30_000_000) // constant + .saturating_add(members.saturating_mul(500_000)) // M + } + + /// Calculate the weight for `close`. + /// + /// Based on benchmarks: + /// - early disapproved: 37.21 + M * 0.239 + P2 * 0.466 + B * 0.002 µs (min squares analysis) + /// - early approved: 50.82 + M * 0.211 + P2 * 0.478 + B * 0.008 µs (min squares analysis) + /// - disapproved: 51.08 + M * 0.224 + P2 * 0.475 + B * 0.003 µs (min squares analysis) + /// - approved: 65.95 + M * 0.226 + P2 * 0.487 + B * 0.005 µs (min squares analysis) + pub(crate) fn close, I: Instance>( + members: Weight, + proposal_weight: Weight, + proposals: Weight, + length: Weight, + ) -> Weight { + let db = T::DbWeight::get(); + close_without_finalize::(members, length) + .saturating_add(db.reads(1)) // `Prime` + .saturating_add(db.writes(1)) // `Proposals` + .saturating_add(db.writes(1)) // `Voting` + .saturating_add(proposal_weight) // P1 + .saturating_add(proposals.saturating_mul(490_000)) // P2 + } + + /// Calculate the weight for `close` without the call to `finalize_proposal`. + pub(crate) fn close_without_finalize, I: Instance>( + members: Weight, + length: Weight, + ) -> Weight { + T::DbWeight::get().reads(3) // `Members`, `Voting`, `ProposalOf` + .saturating_add(66_000_000) // constant + .saturating_add(length.saturating_mul(8_000)) // B + .saturating_add(members.saturating_mul(250_000)) // M + } +} + +/// Return the weight of a dispatch call result as an `Option`. +/// +/// Will return the weight regardless of what the state of the result is. +fn get_result_weight(result: DispatchResultWithPostInfo) -> Option { + match result { + Ok(post_info) => post_info.actual_weight, + Err(err) => err.post_info.actual_weight, } } -// Note: this module is not benchmarked. The weights are obtained based on the similarity of the -// executed logic with other democracy function. Note that councillor operations are assigned to the -// operational class. + +// Note that councillor operations are assigned to the operational class. decl_module! { pub struct Module, I: Instance=DefaultInstance> for enum Call where origin: ::Origin { type Error = Error; @@ -182,72 +343,231 @@ decl_module! { /// Set the collective's membership. /// - /// - `new_members`: The new member list. Be nice to the chain and - // provide it sorted. + /// - `new_members`: The new member list. Be nice to the chain and provide it sorted. /// - `prime`: The prime member whose vote sets the default. + /// - `old_count`: The upper bound for the previous number of members in storage. + /// Used for weight estimation. /// /// Requires root origin. - #[weight = (100_000_000, DispatchClass::Operational)] - fn set_members(origin, new_members: Vec, prime: Option) { + /// + /// NOTE: Does not enforce the expected `MAX_MEMBERS` limit on the amount of members, but + /// the weight estimations rely on it to estimate dispatchable weight. + /// + /// # + /// ## Weight + /// - `O(MP + N)` where: + /// - `M` old-members-count (code- and governance-bounded) + /// - `N` new-members-count (code- and governance-bounded) + /// - `P` proposals-count (code-bounded) + /// - DB: + /// - 1 storage mutation (codec `O(M)` read, `O(N)` write) for reading and writing the members + /// - 1 storage read (codec `O(P)`) for reading the proposals + /// - `P` storage mutations (codec `O(M)`) for updating the votes for each proposal + /// - 1 storage write (codec `O(1)`) for deleting the old `prime` and setting the new one + /// # + #[weight = ( + weight_for::set_members::( + (*old_count).into(), // M + new_members.len() as Weight, // N + T::MaxProposals::get().into(), // P + ), + DispatchClass::Operational + )] + fn set_members(origin, + new_members: Vec, + prime: Option, + old_count: MemberCount, + ) -> DispatchResultWithPostInfo { ensure_root(origin)?; + if new_members.len() > MAX_MEMBERS as usize { + debug::error!( + "New members count exceeds maximum amount of members expected. (expected: {}, actual: {})", + MAX_MEMBERS, + new_members.len() + ); + } + + let old = Members::::get(); + if old.len() > old_count as usize { + debug::warn!( + "Wrong count used to estimate set_members weight. (expected: {}, actual: {})", + old_count, + old.len() + ); + } let mut new_members = new_members; new_members.sort(); - let old = Members::::get(); - >::set_members_sorted(&new_members[..], &old); + >::set_members_sorted(&new_members, &old); Prime::::set(prime); + + Ok(Some(weight_for::set_members::( + old.len() as Weight, // M + new_members.len() as Weight, // N + T::MaxProposals::get().into(), // P + )).into()) } /// Dispatch a proposal from a member using the `Member` origin. /// /// Origin must be a member of the collective. - #[weight = (100_000_000, DispatchClass::Operational)] - fn execute(origin, proposal: Box<>::Proposal>) { + /// + /// # + /// ## Weight + /// - `O(M + P)` where `M` members-count (code-bounded) and `P` complexity of dispatching `proposal` + /// - DB: 1 read (codec `O(M)`) + DB access of `proposal` + /// - 1 event + /// # + #[weight = ( + weight_for::execute::( + MAX_MEMBERS.into(), + proposal.get_dispatch_info().weight, + *length_bound as Weight, + ), + DispatchClass::Operational + )] + fn execute(origin, + proposal: Box<>::Proposal>, + #[compact] length_bound: u32, + ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), Error::::NotMember); + let members = Self::members(); + ensure!(members.contains(&who), Error::::NotMember); + let proposal_len = proposal.using_encoded(|x| x.len()); + ensure!(proposal_len <= length_bound as usize, Error::::WrongProposalLength); let proposal_hash = T::Hashing::hash_of(&proposal); - let ok = proposal.dispatch(RawOrigin::Member(who).into()).is_ok(); - Self::deposit_event(RawEvent::MemberExecuted(proposal_hash, ok)); + let result = proposal.dispatch(RawOrigin::Member(who).into()); + Self::deposit_event( + RawEvent::MemberExecuted(proposal_hash, result.map(|_| ()).map_err(|e| e.error)) + ); + + Ok(get_result_weight(result).map(|w| weight_for::execute::( + members.len() as Weight, + w, + proposal_len as Weight + )).into()) } + /// Add a new proposal to either be voted on or executed directly. + /// + /// Requires the sender to be member. + /// + /// `threshold` determines whether `proposal` is executed directly (`threshold < 2`) + /// or put up for voting. + /// /// # - /// - Bounded storage reads and writes. - /// - Argument `threshold` has bearing on weight. + /// ## Weight + /// - `O(B + M + P1)` or `O(B + M + P2)` where: + /// - `B` is `proposal` size in bytes (length-fee-bounded) + /// - `M` is members-count (code- and governance-bounded) + /// - branching is influenced by `threshold` where: + /// - `P1` is proposal execution complexity (`threshold < 2`) + /// - `P2` is proposals-count (code-bounded) (`threshold >= 2`) + /// - DB: + /// - 1 storage read `is_member` (codec `O(M)`) + /// - 1 storage read `ProposalOf::contains_key` (codec `O(1)`) + /// - DB accesses influenced by `threshold`: + /// - EITHER storage accesses done by `proposal` (`threshold < 2`) + /// - OR proposal insertion (`threshold <= 2`) + /// - 1 storage mutation `Proposals` (codec `O(P2)`) + /// - 1 storage mutation `ProposalCount` (codec `O(1)`) + /// - 1 storage write `ProposalOf` (codec `O(B)`) + /// - 1 storage write `Voting` (codec `O(M)`) + /// - 1 event /// # - #[weight = (5_000_000_000, DispatchClass::Operational)] - fn propose(origin, #[compact] threshold: MemberCount, proposal: Box<>::Proposal>) { + #[weight = ( + if *threshold < 2 { + weight_for::propose_execute::( + MAX_MEMBERS.into(), // M + proposal.get_dispatch_info().weight, // P1 + *length_bound as Weight, // B + ) + } else { + weight_for::propose_proposed::( + MAX_MEMBERS.into(), // M + T::MaxProposals::get().into(), // P2 + *length_bound as Weight, // B + ) + }, + DispatchClass::Operational + )] + fn propose(origin, + #[compact] threshold: MemberCount, + proposal: Box<>::Proposal>, + #[compact] length_bound: u32 + ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), Error::::NotMember); + let members = Self::members(); + ensure!(members.contains(&who), Error::::NotMember); + let proposal_len = proposal.using_encoded(|x| x.len()); + ensure!(proposal_len <= length_bound as usize, Error::::WrongProposalLength); let proposal_hash = T::Hashing::hash_of(&proposal); - ensure!(!>::contains_key(proposal_hash), Error::::DuplicateProposal); if threshold < 2 { let seats = Self::members().len() as MemberCount; - let ok = proposal.dispatch(RawOrigin::Members(1, seats).into()).is_ok(); - Self::deposit_event(RawEvent::Executed(proposal_hash, ok)); + let result = proposal.dispatch(RawOrigin::Members(1, seats).into()); + Self::deposit_event( + RawEvent::Executed(proposal_hash, result.map(|_| ()).map_err(|e| e.error)) + ); + + Ok(get_result_weight(result).map(|w| weight_for::propose_execute::( + members.len() as Weight, // M + w, // P1 + proposal_len as Weight, // B + )).into()) } else { + let active_proposals = + >::try_mutate(|proposals| -> Result { + proposals.push(proposal_hash); + ensure!( + proposals.len() <= T::MaxProposals::get() as usize, + Error::::TooManyProposals + ); + Ok(proposals.len()) + })?; let index = Self::proposal_count(); >::mutate(|i| *i += 1); - >::mutate(|proposals| proposals.push(proposal_hash)); >::insert(proposal_hash, *proposal); let end = system::Module::::block_number() + T::MotionDuration::get(); let votes = Votes { index, threshold, ayes: vec![who.clone()], nays: vec![], end }; >::insert(proposal_hash, votes); Self::deposit_event(RawEvent::Proposed(who, index, proposal_hash, threshold)); + + Ok(Some(weight_for::propose_proposed::( + members.len() as Weight, // M + active_proposals as Weight, // P2 + proposal_len as Weight, // B + )).into()) } } + /// Add an aye or nay vote for the sender to the given proposal. + /// + /// Requires the sender to be a member. + /// /// # - /// - Bounded storage read and writes. - /// - Will be slightly heavier if the proposal is approved / disapproved after the vote. + /// ## Weight + /// - `O(M)` where `M` is members-count (code- and governance-bounded) + /// - DB: + /// - 1 storage read `Members` (codec `O(M)`) + /// - 1 storage mutation `Voting` (codec `O(M)`) + /// - 1 event /// # - #[weight = (200_000_000, DispatchClass::Operational)] - fn vote(origin, proposal: T::Hash, #[compact] index: ProposalIndex, approve: bool) { + #[weight = ( + weight_for::vote::(MAX_MEMBERS.into()), + DispatchClass::Operational + )] + fn vote(origin, + proposal: T::Hash, + #[compact] index: ProposalIndex, + approve: bool, + ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - ensure!(Self::is_member(&who), Error::::NotMember); + let members = Self::members(); + ensure!(members.contains(&who), Error::::NotMember); let mut voting = Self::voting(&proposal).ok_or(Error::::ProposalMissing)?; ensure!(voting.index == index, Error::::WrongIndex); @@ -279,64 +599,134 @@ decl_module! { let no_votes = voting.nays.len() as MemberCount; Self::deposit_event(RawEvent::Voted(who, proposal, approve, yes_votes, no_votes)); - let seats = Self::members().len() as MemberCount; + Voting::::insert(&proposal, voting); - let approved = yes_votes >= voting.threshold; - let disapproved = seats.saturating_sub(no_votes) < voting.threshold; - if approved || disapproved { - Self::finalize_proposal(approved, seats, voting, proposal); - } else { - Voting::::insert(&proposal, voting); - } + Ok(Some(weight_for::vote::(members.len() as Weight)).into()) } - /// May be called by any signed account after the voting duration has ended in order to - /// finish voting and close the proposal. + /// Close a vote that is either approved, disapproved or whose voting period has ended. + /// + /// May be called by any signed account in order to finish voting and close the proposal. + /// + /// If called before the end of the voting period it will only close the vote if it is + /// has enough votes to be approved or disapproved. /// - /// Abstentions are counted as rejections unless there is a prime member set and the prime - /// member cast an approval. + /// If called after the end of the voting period abstentions are counted as rejections + /// unless there is a prime member set and the prime member cast an approval. /// - /// - the weight of `proposal` preimage. - /// - up to three events deposited. - /// - one read, two removals, one mutation. (plus three static reads.) - /// - computation and i/o `O(P + L + M)` where: - /// - `M` is number of members, - /// - `P` is number of active proposals, - /// - `L` is the encoded length of `proposal` preimage. - #[weight = (200_000_000, DispatchClass::Operational)] - fn close(origin, proposal: T::Hash, #[compact] index: ProposalIndex) { + /// + `proposal_weight_bound`: The maximum amount of weight consumed by executing the closed proposal. + /// + `length_bound`: The upper bound for the length of the proposal in storage. Checked via + /// `storage::read` so it is `size_of::() == 4` larger than the pure length. + /// + /// # + /// ## Weight + /// - `O(B + M + P1 + P2)` where: + /// - `B` is `proposal` size in bytes (length-fee-bounded) + /// - `M` is members-count (code- and governance-bounded) + /// - `P1` is the complexity of `proposal` preimage. + /// - `P2` is proposal-count (code-bounded) + /// - DB: + /// - 2 storage reads (`Members`: codec `O(M)`, `Prime`: codec `O(1)`) + /// - 3 mutations (`Voting`: codec `O(M)`, `ProposalOf`: codec `O(B)`, `Proposals`: codec `O(P2)`) + /// - any mutations done while executing `proposal` (`P1`) + /// - up to 3 events + /// # + #[weight = ( + weight_for::close::( + MAX_MEMBERS.into(), // `M` + *proposal_weight_bound, // `P1` + T::MaxProposals::get().into(), // `P2` + *length_bound as Weight, // B + ), + DispatchClass::Operational + )] + fn close(origin, + proposal: T::Hash, + #[compact] index: ProposalIndex, + #[compact] proposal_weight_bound: Weight, + #[compact] length_bound: u32 + ) -> DispatchResultWithPostInfo { let _ = ensure_signed(origin)?; let voting = Self::voting(&proposal).ok_or(Error::::ProposalMissing)?; ensure!(voting.index == index, Error::::WrongIndex); - ensure!(system::Module::::block_number() >= voting.end, Error::::TooEarly); - - // default to true only if there's a prime and they voted in favour. - let default = Self::prime().map_or( - false, - |who| voting.ayes.iter().any(|a| a == &who), - ); let mut no_votes = voting.nays.len() as MemberCount; let mut yes_votes = voting.ayes.len() as MemberCount; let seats = Self::members().len() as MemberCount; + let approved = yes_votes >= voting.threshold; + let disapproved = seats.saturating_sub(no_votes) < voting.threshold; + // Allow (dis-)approving the proposal as soon as there are enough votes. + if approved || disapproved { + let (p, len) = Self::validate_and_get_proposal( + &proposal, + length_bound, + proposal_weight_bound + )?; + let finalize_weight = Self::finalize_proposal(approved, seats, voting, proposal, p); + return Ok(Some( + weight_for::close_without_finalize::(seats.into(), len as Weight) + .saturating_add(finalize_weight) + ).into()); + } + + // Only allow actual closing of the proposal after the voting period has ended. + ensure!(system::Module::::block_number() >= voting.end, Error::::TooEarly); + + // default to true only if there's a prime and they voted in favour. + let default = Self::prime().map_or(false, |who| voting.ayes.iter().any(|a| a == &who)); + let abstentions = seats - (yes_votes + no_votes); match default { true => yes_votes += abstentions, false => no_votes += abstentions, } + let approved = yes_votes >= voting.threshold; + let (p, len) = Self::validate_and_get_proposal( + &proposal, + length_bound, + proposal_weight_bound + )?; Self::deposit_event(RawEvent::Closed(proposal, yes_votes, no_votes)); - Self::finalize_proposal(yes_votes >= voting.threshold, seats, voting, proposal); + let finalize_weight = Self::finalize_proposal(approved, seats, voting, proposal, p); + Ok(Some( + weight_for::close_without_finalize::(seats.into(), len as Weight) + .saturating_add(T::DbWeight::get().reads(1)) // read `Prime` + .saturating_add(finalize_weight) + ).into()) } } } impl, I: Instance> Module { + /// Check whether `who` is a member of the collective. pub fn is_member(who: &T::AccountId) -> bool { + // Note: The dispatchables *do not* use this to check membership so make sure + // to update those if this is changed. Self::members().contains(who) } + /// Ensure that the right proposal bounds were passed and get the proposal from storage. + /// + /// Checks the length in storage via `storage::read` which adds an extra `size_of::() == 4` + /// to the length. + fn validate_and_get_proposal( + hash: &T::Hash, + length_bound: u32, + weight_bound: Weight + ) -> Result<(>::Proposal, usize), DispatchError> { + let key = ProposalOf::::hashed_key_for(hash); + // read the length of the proposal storage entry directly + let proposal_len = storage::read(&key, &mut [0; 0], 0) + .ok_or(Error::::ProposalMissing)?; + ensure!(proposal_len <= length_bound, Error::::WrongProposalLength); + let proposal = ProposalOf::::get(hash).ok_or(Error::::ProposalMissing)?; + let proposal_weight = proposal.get_dispatch_info().weight; + ensure!(proposal_weight <= weight_bound, Error::::WrongProposalWeight); + Ok((proposal, proposal_len as usize)) + } + /// Weight: /// If `approved`: /// - the weight of `proposal` preimage. @@ -355,35 +745,71 @@ impl, I: Instance> Module { approved: bool, seats: MemberCount, voting: Votes, - proposal: T::Hash, - ) { + proposal_hash: T::Hash, + proposal: >::Proposal, + ) -> Weight { + let db = T::DbWeight::get(); + let mut weight: Weight = 0; if approved { - Self::deposit_event(RawEvent::Approved(proposal)); + Self::deposit_event(RawEvent::Approved(proposal_hash)); - // execute motion, assuming it exists. - if let Some(p) = ProposalOf::::take(&proposal) { - let origin = RawOrigin::Members(voting.threshold, seats).into(); - let ok = p.dispatch(origin).is_ok(); - Self::deposit_event(RawEvent::Executed(proposal, ok)); - } + let dispatch_weight = proposal.get_dispatch_info().weight; + let origin = RawOrigin::Members(voting.threshold, seats).into(); + let result = proposal.dispatch(origin); + Self::deposit_event( + RawEvent::Executed(proposal_hash, result.map(|_| ()).map_err(|e| e.error)) + ); + weight = weight.saturating_add( + // default to the dispatch info weight for safety + get_result_weight(result).unwrap_or(dispatch_weight) // P1 + ); } else { // disapproved - ProposalOf::::remove(&proposal); - Self::deposit_event(RawEvent::Disapproved(proposal)); + Self::deposit_event(RawEvent::Disapproved(proposal_hash)); } - // remove vote - Voting::::remove(&proposal); - Proposals::::mutate(|proposals| proposals.retain(|h| h != &proposal)); + // remove proposal and vote + ProposalOf::::remove(&proposal_hash); + Voting::::remove(&proposal_hash); + let num_proposals = Proposals::::mutate(|proposals| { + proposals.retain(|h| h != &proposal_hash); + proposals.len() + 1 // calculate weight based on original length + }); + weight.saturating_add(db.reads_writes(1, 3)) // `Voting`, `Proposals`, `ProposalOf` + .saturating_add(490_000 * num_proposals as Weight) // P2 } } impl, I: Instance> ChangeMembers for Module { + /// Update the members of the collective. Votes are updated and the prime is reset. + /// + /// NOTE: Does not enforce the expected `MAX_MEMBERS` limit on the amount of members, but + /// the weight estimations rely on it to estimate dispatchable weight. + /// + /// # + /// ## Weight + /// - `O(MP + N)` + /// - where `M` old-members-count (governance-bounded) + /// - where `N` new-members-count (governance-bounded) + /// - where `P` proposals-count + /// - DB: + /// - 1 storage read (codec `O(P)`) for reading the proposals + /// - `P` storage mutations for updating the votes (codec `O(M)`) + /// - 1 storage write (codec `O(N)`) for storing the new members + /// - 1 storage write (codec `O(1)`) for deleting the old prime + /// # fn change_members_sorted( _incoming: &[T::AccountId], outgoing: &[T::AccountId], new: &[T::AccountId], ) { + if new.len() > MAX_MEMBERS as usize { + debug::error!( + "New members count exceeds maximum amount of members expected. (expected: {}, actual: {})", + MAX_MEMBERS, + new.len() + ); + } // remove accounts from all current voting in motions. let mut outgoing = outgoing.to_vec(); outgoing.sort_unstable(); @@ -539,6 +965,7 @@ mod tests { pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); pub const MotionDuration: u64 = 3; + pub const MaxProposals: u32 = 100; } impl frame_system::Trait for Test { type Origin = Origin; @@ -569,12 +996,14 @@ mod tests { type Proposal = Call; type Event = Event; type MotionDuration = MotionDuration; + type MaxProposals = MaxProposals; } impl Trait for Test { type Origin = Origin; type Proposal = Call; type Event = Event; type MotionDuration = MotionDuration; + type MaxProposals = MaxProposals; } pub type Block = sp_runtime::generic::Block; @@ -622,17 +1051,17 @@ mod tests { let proposal = make_proposal(42); let hash = BlakeTwo256::hash_of(&proposal); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); System::set_block_number(3); assert_noop!( - Collective::close(Origin::signed(4), hash.clone(), 0), + Collective::close(Origin::signed(4), hash.clone(), 0, Weight::max_value(), u32::max_value()), Error::::TooEarly ); System::set_block_number(4); - assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0)); + assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0, Weight::max_value(), u32::max_value())); let record = |event| EventRecord { phase: Phase::Initialization, event, topics: vec![] }; assert_eq!(System::events(), vec![ @@ -644,18 +1073,37 @@ mod tests { }); } + #[test] + fn proposal_weight_limit_works() { + new_test_ext().execute_with(|| { + let proposal = Call::Collective(crate::Call::set_members(vec![1, 2, 3], None, MAX_MEMBERS)); + let hash = BlakeTwo256::hash_of(&proposal); + + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); + assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); + + System::set_block_number(4); + let proposal_weight = proposal.get_dispatch_info().weight; + assert_noop!( + Collective::close(Origin::signed(4), hash.clone(), 0, proposal_weight - 100, u32::max_value()), + Error::::WrongProposalWeight + ); + assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0, Weight::max_value(), u32::max_value())); + }) + } + #[test] fn close_with_prime_works() { new_test_ext().execute_with(|| { let proposal = make_proposal(42); let hash = BlakeTwo256::hash_of(&proposal); - assert_ok!(Collective::set_members(Origin::ROOT, vec![1, 2, 3], Some(3))); + assert_ok!(Collective::set_members(Origin::ROOT, vec![1, 2, 3], Some(3), MAX_MEMBERS)); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); System::set_block_number(4); - assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0)); + assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0, Weight::max_value(), u32::max_value())); let record = |event| EventRecord { phase: Phase::Initialization, event, topics: vec![] }; assert_eq!(System::events(), vec![ @@ -672,13 +1120,13 @@ mod tests { new_test_ext().execute_with(|| { let proposal = make_proposal(42); let hash = BlakeTwo256::hash_of(&proposal); - assert_ok!(Collective::set_members(Origin::ROOT, vec![1, 2, 3], Some(1))); + assert_ok!(Collective::set_members(Origin::ROOT, vec![1, 2, 3], Some(1), MAX_MEMBERS)); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); System::set_block_number(4); - assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0)); + assert_ok!(Collective::close(Origin::signed(4), hash.clone(), 0, Weight::max_value(), u32::max_value())); let record = |event| EventRecord { phase: Phase::Initialization, event, topics: vec![] }; assert_eq!(System::events(), vec![ @@ -686,7 +1134,7 @@ mod tests { record(Event::collective_Instance1(RawEvent::Voted(2, hash.clone(), true, 2, 0))), record(Event::collective_Instance1(RawEvent::Closed(hash.clone(), 3, 0))), record(Event::collective_Instance1(RawEvent::Approved(hash.clone()))), - record(Event::collective_Instance1(RawEvent::Executed(hash.clone(), false))) + record(Event::collective_Instance1(RawEvent::Executed(hash.clone(), Err(DispatchError::BadOrigin)))) ]); }); } @@ -697,7 +1145,7 @@ mod tests { let proposal = make_proposal(42); let hash = BlakeTwo256::hash_of(&proposal); let end = 4; - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); assert_eq!( Collective::voting(&hash), @@ -711,7 +1159,7 @@ mod tests { let proposal = make_proposal(69); let hash = BlakeTwo256::hash_of(&proposal); - assert_ok!(Collective::propose(Origin::signed(2), 2, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(2), 2, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(3), hash.clone(), 1, false)); assert_eq!( Collective::voting(&hash), @@ -731,13 +1179,13 @@ mod tests { let proposal = make_proposal(42); let hash = BlakeTwo256::hash_of(&proposal); let end = 4; - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); assert_eq!( Collective::voting(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![], end }) ); - assert_ok!(Collective::set_members(Origin::ROOT, vec![2, 3, 4], None)); + assert_ok!(Collective::set_members(Origin::ROOT, vec![2, 3, 4], None, MAX_MEMBERS)); assert_eq!( Collective::voting(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![], end }) @@ -745,13 +1193,13 @@ mod tests { let proposal = make_proposal(69); let hash = BlakeTwo256::hash_of(&proposal); - assert_ok!(Collective::propose(Origin::signed(2), 2, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(2), 2, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(3), hash.clone(), 1, false)); assert_eq!( Collective::voting(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3], end }) ); - assert_ok!(Collective::set_members(Origin::ROOT, vec![2, 4], None)); + assert_ok!(Collective::set_members(Origin::ROOT, vec![2, 4], None, MAX_MEMBERS)); assert_eq!( Collective::voting(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![], end }) @@ -765,7 +1213,7 @@ mod tests { let proposal = make_proposal(42); let hash = proposal.blake2_256().into(); let end = 4; - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_eq!(Collective::proposals(), vec![hash]); assert_eq!(Collective::proposal_of(&hash), Some(proposal)); assert_eq!( @@ -788,12 +1236,56 @@ mod tests { }); } + #[test] + fn limit_active_proposals() { + new_test_ext().execute_with(|| { + for i in 0..MaxProposals::get() { + let proposal = make_proposal(i as u64); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); + } + let proposal = make_proposal(MaxProposals::get() as u64 + 1); + assert_noop!( + Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value()), + Error::::TooManyProposals + ); + }) + } + + #[test] + fn correct_validate_and_get_proposal() { + new_test_ext().execute_with(|| { + let proposal = Call::Collective(crate::Call::set_members(vec![1, 2, 3], None, MAX_MEMBERS)); + let length = proposal.encode().len() as u32; + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), length)); + + let hash = BlakeTwo256::hash_of(&proposal); + let weight = proposal.get_dispatch_info().weight; + assert_noop!( + Collective::validate_and_get_proposal(&BlakeTwo256::hash_of(&vec![3; 4]), length, weight), + Error::::ProposalMissing + ); + assert_noop!( + Collective::validate_and_get_proposal(&hash, length - 2, weight), + Error::::WrongProposalLength + ); + assert_noop!( + Collective::validate_and_get_proposal(&hash, length, weight - 10), + Error::::WrongProposalWeight + ); + let res = Collective::validate_and_get_proposal(&hash, length, weight); + assert_ok!(res.clone()); + let (retrieved_proposal, len) = res.unwrap(); + assert_eq!(length as usize, len); + assert_eq!(proposal, retrieved_proposal); + }) + } + #[test] fn motions_ignoring_non_collective_proposals_works() { new_test_ext().execute_with(|| { let proposal = make_proposal(42); assert_noop!( - Collective::propose(Origin::signed(42), 3, Box::new(proposal.clone())), + Collective::propose(Origin::signed(42), 3, Box::new(proposal.clone()), u32::max_value()), Error::::NotMember ); }); @@ -804,7 +1296,7 @@ mod tests { new_test_ext().execute_with(|| { let proposal = make_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_noop!( Collective::vote(Origin::signed(42), hash.clone(), 0, true), Error::::NotMember, @@ -818,7 +1310,7 @@ mod tests { System::set_block_number(3); let proposal = make_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_noop!( Collective::vote(Origin::signed(2), hash.clone(), 1, true), Error::::WrongIndex, @@ -832,7 +1324,7 @@ mod tests { let proposal = make_proposal(42); let hash: H256 = proposal.blake2_256().into(); let end = 4; - assert_ok!(Collective::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 2, Box::new(proposal.clone()), u32::max_value())); assert_eq!( Collective::voting(&hash), Some(Votes { index: 0, threshold: 2, ayes: vec![1], nays: vec![], end }) @@ -882,10 +1374,11 @@ mod tests { new_test_ext().execute_with(|| { let proposal = make_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, false)); + assert_ok!(Collective::close(Origin::signed(2), hash.clone(), 0, Weight::max_value(), u32::max_value())); assert_eq!(Collective::proposals(), vec![]); - assert_ok!(Collective::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 2, Box::new(proposal.clone()), u32::max_value())); assert_eq!(Collective::proposals(), vec![hash]); }); } @@ -895,8 +1388,9 @@ mod tests { new_test_ext().execute_with(|| { let proposal = make_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 3, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, false)); + assert_ok!(Collective::close(Origin::signed(2), hash.clone(), 0, Weight::max_value(), u32::max_value())); assert_eq!(System::events(), vec![ EventRecord { @@ -937,8 +1431,9 @@ mod tests { new_test_ext().execute_with(|| { let proposal = make_proposal(42); let hash: H256 = proposal.blake2_256().into(); - assert_ok!(Collective::propose(Origin::signed(1), 2, Box::new(proposal.clone()))); + assert_ok!(Collective::propose(Origin::signed(1), 2, Box::new(proposal.clone()), u32::max_value())); assert_ok!(Collective::vote(Origin::signed(2), hash.clone(), 0, true)); + assert_ok!(Collective::close(Origin::signed(2), hash.clone(), 0, Weight::max_value(), u32::max_value())); assert_eq!(System::events(), vec![ EventRecord { @@ -973,7 +1468,7 @@ mod tests { phase: Phase::Initialization, event: Event::collective_Instance1(RawEvent::Executed( hex!["68eea8f20b542ec656c6ac2d10435ae3bd1729efc34d1354ab85af840aad2d35"].into(), - false, + Err(DispatchError::BadOrigin), )), topics: vec![], } -- GitLab From e1e38487c1c4f371e824ac1d0716e900daa04df3 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Thu, 14 May 2020 18:21:07 +0200 Subject: [PATCH 048/150] Don't log the yamux errors by default (#6034) --- client/cli/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 2b26259b92..f9660af8a0 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -217,6 +217,7 @@ pub fn init_logger(pattern: &str) { let mut builder = env_logger::Builder::new(); // Disable info logging by default for some modules: builder.filter(Some("ws"), log::LevelFilter::Off); + builder.filter(Some("yamux"), log::LevelFilter::Off); builder.filter(Some("hyper"), log::LevelFilter::Warn); builder.filter(Some("cranelift_wasm"), log::LevelFilter::Warn); // Always log the special target `sc_tracing`, overrides global level -- GitLab From ea501c2d61d27e7f0f76f93e5fa7e5c90882da2f Mon Sep 17 00:00:00 2001 From: Demi Obenour Date: Thu, 14 May 2020 22:01:56 +0000 Subject: [PATCH 049/150] =?UTF-8?q?Add=20=E2=80=98transaction=5Fversion?= =?UTF-8?q?=E2=80=99=20to=20the=20signed=20transaction=20(#5979)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add ‘transaction_version’ to the signed transaction This allows hardware wallets to know which transactions they can safely sign. To reduce transaction size, I reduced it to a ‘u8’ from a ‘u32’. Fixes #5951. * Restore transaction_version to a u32 * Fix comments `transaction_version` is not part of a tx, but is still signed. Co-authored-by: Bastian Köcher * Fix the test suite I had forgotten to change the production of transactions in the test code. * Fix benchmarks * Improve docs for `CheckTxVersion` in `frame_system` Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Remove spurious cast Co-authored-by: Bastian Köcher Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> --- bin/node-template/runtime/src/lib.rs | 3 +- bin/node/cli/src/service.rs | 13 +++-- bin/node/executor/benches/bench.rs | 6 ++- bin/node/executor/tests/common.rs | 6 ++- bin/node/executor/tests/submit_transaction.rs | 4 +- bin/node/runtime/src/lib.rs | 10 +++- bin/node/testing/src/keyring.rs | 7 +-- bin/utils/subkey/src/main.rs | 6 ++- frame/system/src/lib.rs | 51 ++++++++++++++++--- 9 files changed, 81 insertions(+), 25 deletions(-) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 7c3302d8ed..b1b73f3b49 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -281,7 +281,8 @@ pub type SignedBlock = generic::SignedBlock; pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. pub type SignedExtra = ( - system::CheckVersion, + system::CheckSpecVersion, + system::CheckTxVersion, system::CheckGenesis, system::CheckEra, system::CheckNonce, diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 7e27d57063..7d6a210bee 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -602,12 +602,16 @@ mod tests { let from: Address = AccountPublic::from(charlie.public()).into_account().into(); let genesis_hash = service.client().block_hash(0).unwrap().unwrap(); let best_block_id = BlockId::number(service.client().chain_info().best_number); - let version = service.client().runtime_version_at(&best_block_id).unwrap().spec_version; + let (spec_version, transaction_version) = { + let version = service.client().runtime_version_at(&best_block_id).unwrap(); + (version.spec_version, version.transaction_version) + }; let signer = charlie.clone(); let function = Call::Balances(BalancesCall::transfer(to.into(), amount)); - let check_version = frame_system::CheckVersion::new(); + let check_spec_version = frame_system::CheckSpecVersion::new(); + let check_tx_version = frame_system::CheckTxVersion::new(); let check_genesis = frame_system::CheckGenesis::new(); let check_era = frame_system::CheckEra::from(Era::Immortal); let check_nonce = frame_system::CheckNonce::from(index); @@ -615,7 +619,8 @@ mod tests { let payment = pallet_transaction_payment::ChargeTransactionPayment::from(0); let validate_grandpa_equivocation = pallet_grandpa::ValidateEquivocationReport::new(); let extra = ( - check_version, + check_spec_version, + check_tx_version, check_genesis, check_era, check_nonce, @@ -626,7 +631,7 @@ mod tests { let raw_payload = SignedPayload::from_raw( function, extra, - (version, genesis_hash, genesis_hash, (), (), (), ()) + (spec_version, transaction_version, genesis_hash, genesis_hash, (), (), (), ()) ); let signature = raw_payload.using_encoded(|payload| { signer.sign(payload) diff --git a/bin/node/executor/benches/bench.rs b/bin/node/executor/benches/bench.rs index 4f335df90d..0f269c301b 100644 --- a/bin/node/executor/benches/bench.rs +++ b/bin/node/executor/benches/bench.rs @@ -39,7 +39,9 @@ const COMPACT_CODE: &[u8] = node_runtime::WASM_BINARY; const GENESIS_HASH: [u8; 32] = [69u8; 32]; -const VERSION: u32 = node_runtime::VERSION.spec_version; +const TRANSACTION_VERSION: u32 = node_runtime::VERSION.transaction_version; + +const SPEC_VERSION: u32 = node_runtime::VERSION.spec_version; const HEAP_PAGES: u64 = 20; @@ -52,7 +54,7 @@ enum ExecutionMethod { } fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { - node_testing::keyring::sign(xt, VERSION, GENESIS_HASH) + node_testing::keyring::sign(xt, SPEC_VERSION, TRANSACTION_VERSION, GENESIS_HASH) } fn new_test_ext(genesis_config: &GenesisConfig) -> TestExternalities { diff --git a/bin/node/executor/tests/common.rs b/bin/node/executor/tests/common.rs index 5a51e4312c..e888c269cc 100644 --- a/bin/node/executor/tests/common.rs +++ b/bin/node/executor/tests/common.rs @@ -71,12 +71,14 @@ pub const COMPACT_CODE: &[u8] = node_runtime::WASM_BINARY; pub const GENESIS_HASH: [u8; 32] = [69u8; 32]; -pub const VERSION: u32 = node_runtime::VERSION.spec_version; +pub const SPEC_VERSION: u32 = node_runtime::VERSION.spec_version; + +pub const TRANSACTION_VERSION: u32 = node_runtime::VERSION.transaction_version; pub type TestExternalities = CoreTestExternalities; pub fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { - node_testing::keyring::sign(xt, VERSION, GENESIS_HASH) + node_testing::keyring::sign(xt, SPEC_VERSION, TRANSACTION_VERSION, GENESIS_HASH) } pub fn default_transfer_call() -> pallet_balances::Call { diff --git a/bin/node/executor/tests/submit_transaction.rs b/bin/node/executor/tests/submit_transaction.rs index b968159d32..7ebee2658b 100644 --- a/bin/node/executor/tests/submit_transaction.rs +++ b/bin/node/executor/tests/submit_transaction.rs @@ -122,7 +122,7 @@ fn should_submit_signed_twice_from_the_same_account() { let s = state.read(); fn nonce(tx: UncheckedExtrinsic) -> frame_system::CheckNonce { let extra = tx.signature.unwrap().2; - extra.3 + extra.4 } let nonce1 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[0]).unwrap()); let nonce2 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[1]).unwrap()); @@ -170,7 +170,7 @@ fn should_submit_signed_twice_from_all_accounts() { let s = state.read(); fn nonce(tx: UncheckedExtrinsic) -> frame_system::CheckNonce { let extra = tx.signature.unwrap().2; - extra.3 + extra.4 } let nonce1 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[0]).unwrap()); let nonce2 = nonce(UncheckedExtrinsic::decode(&mut &*s.transactions[1]).unwrap()); diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 1eec930dfb..85fce74ed9 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -535,7 +535,8 @@ impl frame_system::offchain::CreateSignedTransaction for R .saturating_sub(1); let tip = 0; let extra: SignedExtra = ( - frame_system::CheckVersion::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), frame_system::CheckGenesis::::new(), frame_system::CheckEra::::from(generic::Era::mortal(period, current_block)), frame_system::CheckNonce::::from(nonce), @@ -745,8 +746,13 @@ pub type SignedBlock = generic::SignedBlock; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; /// The SignedExtension to the basic transaction logic. +/// +/// When you change this, you **MUST** modify [`sign`] in `bin/node/testing/src/keyring.rs`! +/// +/// [`sign`]: <../../testing/src/keyring.rs.html> pub type SignedExtra = ( - frame_system::CheckVersion, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, frame_system::CheckGenesis, frame_system::CheckEra, frame_system::CheckNonce, diff --git a/bin/node/testing/src/keyring.rs b/bin/node/testing/src/keyring.rs index 7ed2b36502..2b1d6f985a 100644 --- a/bin/node/testing/src/keyring.rs +++ b/bin/node/testing/src/keyring.rs @@ -68,7 +68,8 @@ pub fn to_session_keys( /// Returns transaction extra. pub fn signed_extra(nonce: Index, extra_fee: Balance) -> SignedExtra { ( - frame_system::CheckVersion::new(), + frame_system::CheckSpecVersion::new(), + frame_system::CheckTxVersion::new(), frame_system::CheckGenesis::new(), frame_system::CheckEra::from(Era::mortal(256, 0)), frame_system::CheckNonce::from(nonce), @@ -79,10 +80,10 @@ pub fn signed_extra(nonce: Index, extra_fee: Balance) -> SignedExtra { } /// Sign given `CheckedExtrinsic`. -pub fn sign(xt: CheckedExtrinsic, version: u32, genesis_hash: [u8; 32]) -> UncheckedExtrinsic { +pub fn sign(xt: CheckedExtrinsic, spec_version: u32, tx_version: u32, genesis_hash: [u8; 32]) -> UncheckedExtrinsic { match xt.signed { Some((signed, extra)) => { - let payload = (xt.function, extra.clone(), version, genesis_hash, genesis_hash); + let payload = (xt.function, extra.clone(), spec_version, tx_version, genesis_hash, genesis_hash); let key = AccountKeyring::from_account_id(&signed).unwrap(); let signature = payload.using_encoded(|b| { if b.len() > 256 { diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index 754a2611bc..dd618393c3 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -702,7 +702,8 @@ fn create_extrinsic( { let extra = |i: Index, f: Balance| { ( - frame_system::CheckVersion::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), frame_system::CheckGenesis::::new(), frame_system::CheckEra::::from(Era::Immortal), frame_system::CheckNonce::::from(i), @@ -715,7 +716,8 @@ fn create_extrinsic( function, extra(index, 0), ( - VERSION.spec_version as u32, + VERSION.spec_version, + VERSION.transaction_version, genesis_hash, genesis_hash, (), diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index ff6893d629..f1e04c5424 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -53,7 +53,9 @@ //! - [`CheckEra`]: Checks the era of the transaction. Contains a single payload of type `Era`. //! - [`CheckGenesis`]: Checks the provided genesis hash of the transaction. Must be a part of the //! signed payload of the transaction. -//! - [`CheckVersion`]: Checks that the runtime version is the same as the one encoded in the +//! - [`CheckSpecVersion`]: Checks that the runtime version is the same as the one used to sign the +//! transaction. +//! - [`CheckTxVersion`]: Checks that the transaction version is the same as the one used to sign the //! transaction. //! //! Lookup the runtime aggregator file (e.g. `node/runtime`) to see the full list of signed @@ -1735,14 +1737,49 @@ impl SignedExtension for CheckGenesis { } } +/// Ensure the transaction version registered in the transaction is the same as at present. +#[derive(Encode, Decode, Clone, Eq, PartialEq)] +pub struct CheckTxVersion(sp_std::marker::PhantomData); + +impl Debug for CheckTxVersion { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + write!(f, "CheckTxVersion") + } + + #[cfg(not(feature = "std"))] + fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + Ok(()) + } +} + +impl CheckTxVersion { + /// Create new `SignedExtension` to check transaction version. + pub fn new() -> Self { + Self(sp_std::marker::PhantomData) + } +} + +impl SignedExtension for CheckTxVersion { + type AccountId = T::AccountId; + type Call = ::Call; + type AdditionalSigned = u32; + type Pre = (); + const IDENTIFIER: &'static str = "CheckTxVersion"; + + fn additional_signed(&self) -> Result { + Ok(>::runtime_version().transaction_version) + } +} + /// Ensure the runtime version registered in the transaction is the same as at present. #[derive(Encode, Decode, Clone, Eq, PartialEq)] -pub struct CheckVersion(sp_std::marker::PhantomData); +pub struct CheckSpecVersion(sp_std::marker::PhantomData); -impl Debug for CheckVersion { +impl Debug for CheckSpecVersion { #[cfg(feature = "std")] fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "CheckVersion") + write!(f, "CheckSpecVersion") } #[cfg(not(feature = "std"))] @@ -1751,19 +1788,19 @@ impl Debug for CheckVersion { } } -impl CheckVersion { +impl CheckSpecVersion { /// Create new `SignedExtension` to check runtime version. pub fn new() -> Self { Self(sp_std::marker::PhantomData) } } -impl SignedExtension for CheckVersion { +impl SignedExtension for CheckSpecVersion { type AccountId = T::AccountId; type Call = ::Call; type AdditionalSigned = u32; type Pre = (); - const IDENTIFIER: &'static str = "CheckVersion"; + const IDENTIFIER: &'static str = "CheckSpecVersion"; fn additional_signed(&self) -> Result { Ok(>::runtime_version().spec_version) -- GitLab From 0ce6dbff288ae5b3a75207ca3a5b34d475b1829b Mon Sep 17 00:00:00 2001 From: gabriel klawitter Date: Fri, 15 May 2020 11:34:16 +0530 Subject: [PATCH 050/150] ci: github api use token for pull requests (#6037) --- .maintain/gitlab/check_polkadot_companion_build.sh | 2 +- .maintain/gitlab/check_polkadot_companion_status.sh | 2 +- .maintain/gitlab/skip_if_draft.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.maintain/gitlab/check_polkadot_companion_build.sh b/.maintain/gitlab/check_polkadot_companion_build.sh index a085076449..281fa8e1e8 100755 --- a/.maintain/gitlab/check_polkadot_companion_build.sh +++ b/.maintain/gitlab/check_polkadot_companion_build.sh @@ -12,7 +12,7 @@ github_api_substrate_pull_url="https://api.github.com/repos/paritytech/substrate/pulls" # use github api v3 in order to access the data without authentication -github_header="Accept: application/vnd.github.v3+json" +github_header="Authorization: token ${GITHUB_PR_TOKEN}" boldprint () { printf "|\n| \033[1m${@}\033[0m\n|\n" ; } boldcat () { printf "|\n"; while read l; do printf "| \033[1m${l}\033[0m\n"; done; printf "|\n" ; } diff --git a/.maintain/gitlab/check_polkadot_companion_status.sh b/.maintain/gitlab/check_polkadot_companion_status.sh index 5387e68f25..b781831055 100755 --- a/.maintain/gitlab/check_polkadot_companion_status.sh +++ b/.maintain/gitlab/check_polkadot_companion_status.sh @@ -7,7 +7,7 @@ github_api_substrate_pull_url="https://api.github.com/repos/paritytech/substrate/pulls" github_api_polkadot_pull_url="https://api.github.com/repos/paritytech/polkadot/pulls" # use github api v3 in order to access the data without authentication -github_header="Accept: application/vnd.github.v3+json" +github_header="Authorization: token ${GITHUB_PR_TOKEN}" boldprint () { printf "|\n| \033[1m${@}\033[0m\n|\n" ; } boldcat () { printf "|\n"; while read l; do printf "| \033[1m${l}\033[0m\n"; done; printf "|\n" ; } diff --git a/.maintain/gitlab/skip_if_draft.sh b/.maintain/gitlab/skip_if_draft.sh index a234a6c18e..cf6ea6a5b3 100755 --- a/.maintain/gitlab/skip_if_draft.sh +++ b/.maintain/gitlab/skip_if_draft.sh @@ -2,7 +2,7 @@ url="https://api.github.com/repos/paritytech/substrate/pulls/${CI_COMMIT_REF_NAME}" echo "[+] API URL: $url" -draft_state=$(curl "$url" | jq -r .draft) +draft_state=$(curl -H "Authorization: token ${GITHUB_PR_TOKEN}" "$url" | jq -r .draft) echo "[+] Draft state: $draft_state" if [ "$draft_state" = 'true' ]; then -- GitLab From 940e52110464cefaae4c1ab98db3cfaacf4d8287 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Fri, 15 May 2020 11:07:19 +0200 Subject: [PATCH 051/150] Update Staking Weights (#5964) --- frame/babe/src/lib.rs | 9 + frame/session/src/lib.rs | 12 ++ frame/staking/src/benchmarking.rs | 216 +++++++++++++++---- frame/staking/src/lib.rs | 333 +++++++++++++++++++++++++----- frame/staking/src/mock.rs | 18 +- frame/staking/src/slashing.rs | 25 ++- frame/staking/src/tests.rs | 156 +++++++++++--- frame/support/src/traits.rs | 15 ++ 8 files changed, 654 insertions(+), 130 deletions(-) diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index dc704b5bcc..209b7eea38 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -349,6 +349,9 @@ impl Module { // -------------- IMPORTANT NOTE -------------- // This implementation is linked to how [`should_epoch_change`] is working. This might need to // be updated accordingly, if the underlying mechanics of slot and epochs change. + // + // WEIGHT NOTE: This function is tied to the weight of `EstimateNextSessionRotation`. If you update + // this function, you must also update the corresponding weight. pub fn next_expected_epoch_change(now: T::BlockNumber) -> Option { let next_slot = Self::current_epoch_start().saturating_add(T::EpochDuration::get()); next_slot @@ -550,6 +553,12 @@ impl frame_support::traits::EstimateNextSessionRotation Option { Self::next_expected_epoch_change(now) } + + // The validity of this weight depends on the implementation of `estimate_next_session_rotation` + fn weight(_now: T::BlockNumber) -> Weight { + // Read: Current Slot, Epoch Index, Genesis Slot + T::DbWeight::get().reads(3) + } } impl frame_support::traits::Lateness for Module { diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 8e25221131..167cf8bcdb 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -170,6 +170,14 @@ impl< offset }) } + + fn weight(_now: BlockNumber) -> Weight { + // Weight note: `estimate_next_session_rotation` has no storage reads and trivial computational overhead. + // There should be no risk to the chain having this weight value be zero for now. + // However, this value of zero was not properly calculated, and so it would be reasonable + // to come back here and properly calculate the weight of this function. + 0 + } } /// A trait for managing creation of new validator set. @@ -785,4 +793,8 @@ impl EstimateNextNewSession for Module { fn estimate_next_new_session(now: T::BlockNumber) -> Option { T::NextSessionRotation::estimate_next_session_rotation(now) } + + fn weight(now: T::BlockNumber) -> Weight { + T::NextSessionRotation::weight(now) + } } diff --git a/frame/staking/src/benchmarking.rs b/frame/staking/src/benchmarking.rs index 2686623aa1..8c5f70daef 100644 --- a/frame/staking/src/benchmarking.rs +++ b/frame/staking/src/benchmarking.rs @@ -27,9 +27,11 @@ use frame_system::RawOrigin; use frame_benchmarking::{benchmarks, account}; use crate::Module as Staking; -use frame_system::Module as System; const SEED: u32 = 0; +const MAX_SPANS: u32 = 100; +const MAX_VALIDATORS: u32 = 1000; +const MAX_SLASHES: u32 = 1000; fn create_funded_user(string: &'static str, n: u32) -> T::AccountId { let user = account(string, n, SEED); @@ -62,6 +64,22 @@ fn create_validators(max: u32) -> Result(who: &T::AccountId, spans: u32) { + if spans == 0 { return } + + // For the first slashing span, we initialize + let mut slashing_spans = crate::slashing::SlashingSpans::new(0); + SpanSlash::::insert((who, 0), crate::slashing::SpanRecord::default()); + + for i in 1 .. spans { + assert!(slashing_spans.end_span(i)); + SpanSlash::::insert((who, i), crate::slashing::SpanRecord::default()); + } + SlashingSpans::::insert(who, slashing_spans); +} + // This function generates v validators and n nominators who are randomly nominating up to MAX_NOMINATIONS. pub fn create_validators_with_nominators_for_era(v: u32, n: u32) -> Result<(), &'static str> { let mut validators: Vec<::Source> = Vec::with_capacity(v as usize); @@ -157,46 +175,93 @@ benchmarks! { let u in ...; let stash = create_funded_user::("stash",u); let controller = create_funded_user::("controller", u); - let controller_lookup: ::Source = T::Lookup::unlookup(controller); + let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); let reward_destination = RewardDestination::Staked; let amount = T::Currency::minimum_balance() * 10.into(); - }: _(RawOrigin::Signed(stash), controller_lookup, amount, reward_destination) + }: _(RawOrigin::Signed(stash.clone()), controller_lookup, amount, reward_destination) + verify { + assert!(Bonded::::contains_key(stash)); + assert!(Ledger::::contains_key(controller)); + } bond_extra { let u in ...; - let (stash, _) = create_stash_controller::(u)?; + let (stash, controller) = create_stash_controller::(u)?; let max_additional = T::Currency::minimum_balance() * 10.into(); + let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; + let original_bonded: BalanceOf = ledger.active; }: _(RawOrigin::Signed(stash), max_additional) + verify { + let ledger = Ledger::::get(&controller).ok_or("ledger not created after")?; + let new_bonded: BalanceOf = ledger.active; + assert!(original_bonded < new_bonded); + } unbond { let u in ...; let (_, controller) = create_stash_controller::(u)?; let amount = T::Currency::minimum_balance() * 10.into(); - }: _(RawOrigin::Signed(controller), amount) + let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; + let original_bonded: BalanceOf = ledger.active; + }: _(RawOrigin::Signed(controller.clone()), amount) + verify { + let ledger = Ledger::::get(&controller).ok_or("ledger not created after")?; + let new_bonded: BalanceOf = ledger.active; + assert!(original_bonded > new_bonded); + } + + // Withdraw only updates the ledger + withdraw_unbonded_update { + // Slashing Spans + let s in 0 .. MAX_SPANS; + let (stash, controller) = create_stash_controller::(0)?; + add_slashing_spans::(&stash, s); + let amount = T::Currency::minimum_balance() * 5.into(); // Half of total + Staking::::unbond(RawOrigin::Signed(controller.clone()).into(), amount)?; + CurrentEra::put(EraIndex::max_value()); + let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; + let original_total: BalanceOf = ledger.total; + }: withdraw_unbonded(RawOrigin::Signed(controller.clone()), s) + verify { + let ledger = Ledger::::get(&controller).ok_or("ledger not created after")?; + let new_total: BalanceOf = ledger.total; + assert!(original_total > new_total); + } // Worst case scenario, everything is removed after the bonding duration - withdraw_unbonded { - let u in ...; - let (stash, controller) = create_stash_controller::(u)?; + withdraw_unbonded_kill { + // Slashing Spans + let s in 0 .. MAX_SPANS; + let (stash, controller) = create_stash_controller::(0)?; + add_slashing_spans::(&stash, s); let amount = T::Currency::minimum_balance() * 10.into(); Staking::::unbond(RawOrigin::Signed(controller.clone()).into(), amount)?; - let current_block = System::::block_number(); - // let unbond_block = current_block + T::BondingDuration::get().into() + 10.into(); - // System::::set_block_number(unbond_block); - }: _(RawOrigin::Signed(controller)) + CurrentEra::put(EraIndex::max_value()); + let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; + let original_total: BalanceOf = ledger.total; + }: withdraw_unbonded(RawOrigin::Signed(controller.clone()), s) + verify { + assert!(!Ledger::::contains_key(controller)); + } validate { let u in ...; - let (_, controller) = create_stash_controller::(u)?; + let (stash, controller) = create_stash_controller::(u)?; let prefs = ValidatorPrefs::default(); }: _(RawOrigin::Signed(controller), prefs) + verify { + assert!(Validators::::contains_key(stash)); + } // Worst case scenario, MAX_NOMINATIONS nominate { let n in 1 .. MAX_NOMINATIONS as u32; - let (_, controller) = create_stash_controller::(n + 1)?; + let (stash, controller) = create_stash_controller::(n + 1)?; let validators = create_validators::(n)?; }: _(RawOrigin::Signed(controller), validators) + verify { + assert!(Nominators::::contains_key(stash)); + } chill { let u in ...; @@ -205,61 +270,91 @@ benchmarks! { set_payee { let u in ...; - let (_, controller) = create_stash_controller::(u)?; + let (stash, controller) = create_stash_controller::(u)?; + assert_eq!(Payee::::get(&stash), RewardDestination::Staked); }: _(RawOrigin::Signed(controller), RewardDestination::Controller) + verify { + assert_eq!(Payee::::get(&stash), RewardDestination::Controller); + } set_controller { let u in ...; let (stash, _) = create_stash_controller::(u)?; let new_controller = create_funded_user::("new_controller", u); - let new_controller_lookup = T::Lookup::unlookup(new_controller); + let new_controller_lookup = T::Lookup::unlookup(new_controller.clone()); }: _(RawOrigin::Signed(stash), new_controller_lookup) + verify { + assert!(Ledger::::contains_key(&new_controller)); + } set_validator_count { - let c in 0 .. 1000; + let c in 0 .. MAX_VALIDATORS; }: _(RawOrigin::Root, c) + verify { + assert_eq!(ValidatorCount::get(), c); + } force_no_eras { let i in 0 .. 1; }: _(RawOrigin::Root) + verify { assert_eq!(ForceEra::get(), Forcing::ForceNone); } force_new_era {let i in 0 .. 1; }: _(RawOrigin::Root) + verify { assert_eq!(ForceEra::get(), Forcing::ForceNew); } force_new_era_always { let i in 0 .. 1; }: _(RawOrigin::Root) + verify { assert_eq!(ForceEra::get(), Forcing::ForceAlways); } // Worst case scenario, the list of invulnerables is very long. set_invulnerables { - let v in 0 .. 1000; + let v in 0 .. MAX_VALIDATORS; let mut invulnerables = Vec::new(); for i in 0 .. v { invulnerables.push(account("invulnerable", i, SEED)); } }: _(RawOrigin::Root, invulnerables) + verify { + assert_eq!(Invulnerables::::get().len(), v as usize); + } force_unstake { - let u in ...; - let (stash, _) = create_stash_controller::(u)?; - }: _(RawOrigin::Root, stash) + // Slashing Spans + let s in 0 .. MAX_SPANS; + let (stash, controller) = create_stash_controller::(0)?; + add_slashing_spans::(&stash, s); + }: _(RawOrigin::Root, stash, s) + verify { + assert!(!Ledger::::contains_key(&controller)); + } cancel_deferred_slash { - let s in 1 .. 1000; + let s in 1 .. MAX_SLASHES; let mut unapplied_slashes = Vec::new(); let era = EraIndex::one(); - for _ in 0 .. 1000 { + for _ in 0 .. MAX_SLASHES { unapplied_slashes.push(UnappliedSlash::>::default()); } UnappliedSlashes::::insert(era, &unapplied_slashes); let slash_indices: Vec = (0 .. s).collect(); }: _(RawOrigin::Root, era, slash_indices) + verify { + assert_eq!(UnappliedSlashes::::get(&era).len(), (MAX_SLASHES - s) as usize); + } payout_stakers { - let n in 1 .. MAX_NOMINATIONS as u32; - let validator = create_validator_with_nominators::(n, MAX_NOMINATIONS as u32)?; + let n in 1 .. T::MaxNominatorRewardedPerValidator::get() as u32; + let validator = create_validator_with_nominators::(n, T::MaxNominatorRewardedPerValidator::get() as u32)?; let current_era = CurrentEra::get().unwrap(); - let caller = account("caller", n, SEED); - }: _(RawOrigin::Signed(caller), validator, current_era) + let caller = account("caller", 0, SEED); + let balance_before = T::Currency::free_balance(&validator); + }: _(RawOrigin::Signed(caller), validator.clone(), current_era) + verify { + // Validator has been paid! + let balance_after = T::Currency::free_balance(&validator); + assert!(balance_before < balance_after); + } rebond { - let l in 1 .. 1000; + let l in 1 .. MAX_UNLOCKING_CHUNKS as u32; let (_, controller) = create_stash_controller::(u)?; let mut staking_ledger = Ledger::::get(controller.clone()).unwrap(); let unlock_chunk = UnlockChunk::> { @@ -269,8 +364,14 @@ benchmarks! { for _ in 0 .. l { staking_ledger.unlocking.push(unlock_chunk.clone()) } - Ledger::::insert(controller.clone(), staking_ledger); - }: _(RawOrigin::Signed(controller), (l + 100).into()) + Ledger::::insert(controller.clone(), staking_ledger.clone()); + let original_bonded: BalanceOf = staking_ledger.active; + }: _(RawOrigin::Signed(controller.clone()), (l + 100).into()) + verify { + let ledger = Ledger::::get(&controller).ok_or("ledger not created after")?; + let new_bonded: BalanceOf = ledger.active; + assert!(original_bonded < new_bonded); + } set_history_depth { let e in 1 .. 100; @@ -285,13 +386,20 @@ benchmarks! { >::insert(i, BalanceOf::::one()); ErasStartSessionIndex::insert(i, i); } - }: _(RawOrigin::Root, EraIndex::zero()) + }: _(RawOrigin::Root, EraIndex::zero(), u32::max_value()) + verify { + assert_eq!(HistoryDepth::get(), 0); + } reap_stash { - let u in 1 .. 1000; - let (stash, controller) = create_stash_controller::(u)?; + let s in 1 .. MAX_SPANS; + let (stash, controller) = create_stash_controller::(0)?; + add_slashing_spans::(&stash, s); T::Currency::make_free_balance_be(&stash, 0.into()); - }: _(RawOrigin::Signed(controller), stash) + }: _(RawOrigin::Signed(controller), stash.clone(), s) + verify { + assert!(!Bonded::::contains_key(&stash)); + } new_era { let v in 1 .. 10; @@ -305,7 +413,7 @@ benchmarks! { } do_slash { - let l in 1 .. 1000; + let l in 1 .. MAX_UNLOCKING_CHUNKS as u32; let (stash, controller) = create_stash_controller::(0)?; let mut staking_ledger = Ledger::::get(controller.clone()).unwrap(); let unlock_chunk = UnlockChunk::> { @@ -317,6 +425,7 @@ benchmarks! { } Ledger::::insert(controller.clone(), staking_ledger.clone()); let slash_amount = T::Currency::minimum_balance() * 10.into(); + let balance_before = T::Currency::free_balance(&stash); }: { crate::slashing::do_slash::( &stash, @@ -324,6 +433,9 @@ benchmarks! { &mut BalanceOf::::zero(), &mut NegativeImbalanceOf::::zero() ); + } verify { + let balance_after = T::Currency::free_balance(&stash); + assert!(balance_before > balance_after); } payout_all { @@ -395,7 +507,7 @@ mod tests { let validator_stash = create_validator_with_nominators::( n, - MAX_NOMINATIONS as u32, + ::MaxNominatorRewardedPerValidator::get() as u32, ).unwrap(); let current_era = CurrentEra::get().unwrap(); @@ -408,6 +520,35 @@ mod tests { }); } + #[test] + fn add_slashing_spans_works() { + ExtBuilder::default().has_stakers(false).build().execute_with(|| { + let n = 10; + + let validator_stash = create_validator_with_nominators::( + n, + ::MaxNominatorRewardedPerValidator::get() as u32, + ).unwrap(); + + // Add 20 slashing spans + let num_of_slashing_spans = 20; + add_slashing_spans::(&validator_stash, num_of_slashing_spans); + + let slashing_spans = SlashingSpans::::get(&validator_stash).unwrap(); + assert_eq!(slashing_spans.iter().count(), num_of_slashing_spans as usize); + for i in 0 .. num_of_slashing_spans { + assert!(SpanSlash::::contains_key((&validator_stash, i))); + } + + // Test everything is cleaned up + assert_ok!(Staking::kill_stash(&validator_stash, num_of_slashing_spans)); + assert!(SlashingSpans::::get(&validator_stash).is_none()); + for i in 0 .. num_of_slashing_spans { + assert!(!SpanSlash::::contains_key((&validator_stash, i))); + } + }); + } + #[test] fn test_payout_all() { ExtBuilder::default().has_stakers(false).build().execute_with(|| { @@ -432,7 +573,8 @@ mod tests { assert_ok!(test_benchmark_bond::()); assert_ok!(test_benchmark_bond_extra::()); assert_ok!(test_benchmark_unbond::()); - assert_ok!(test_benchmark_withdraw_unbonded::()); + assert_ok!(test_benchmark_withdraw_unbonded_update::()); + assert_ok!(test_benchmark_withdraw_unbonded_kill::()); assert_ok!(test_benchmark_validate::()); assert_ok!(test_benchmark_nominate::()); assert_ok!(test_benchmark_chill::()); diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 71042d69b3..9d6ff12b1f 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -290,9 +290,9 @@ use sp_std::{ use codec::{HasCompact, Encode, Decode}; use frame_support::{ decl_module, decl_event, decl_storage, ensure, decl_error, debug, - weights::{Weight, DispatchClass}, + weights::{Weight, constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS}}, storage::IterableStorageMap, - dispatch::{IsSubType, DispatchResult}, + dispatch::{IsSubType, DispatchResult, DispatchResultWithPostInfo}, traits::{ Currency, LockIdentifier, LockableCurrency, WithdrawReasons, OnUnbalanced, Imbalance, Get, UnixTime, EstimateNextNewSession, EnsureOrigin, @@ -1164,6 +1164,10 @@ decl_error! { PhragmenBogusScore, /// The call is not allowed at the given time due to restrictions of election period. CallNotAllowed, + /// Incorrect previous history depth input provided. + IncorrectHistoryDepth, + /// Incorrect number of slashing spans provided. + IncorrectSlashingSpans, } } @@ -1185,6 +1189,11 @@ decl_module! { /// worker, if applicable, will execute at the end of the current block, and solutions may /// be submitted. fn on_initialize(now: T::BlockNumber) -> Weight { + let mut consumed_weight = 0; + let mut add_weight = |reads, writes, weight| { + consumed_weight += T::DbWeight::get().reads_writes(reads, writes); + consumed_weight += weight; + }; if // if we don't have any ongoing offchain compute. Self::era_election_status().is_closed() && @@ -1195,12 +1204,15 @@ decl_module! { if let Some(remaining) = next_session_change.checked_sub(&now) { if remaining <= T::ElectionLookahead::get() && !remaining.is_zero() { // create snapshot. - if Self::create_stakers_snapshot() { + let (did_snapshot, snapshot_weight) = Self::create_stakers_snapshot(); + add_weight(0, 0, snapshot_weight); + if did_snapshot { // Set the flag to make sure we don't waste any compute here in the same era // after we have triggered the offline compute. >::put( ElectionStatus::::Open(now) ); + add_weight(0, 1, 0); log!(info, "💸 Election window is Open({:?}). Snapshot created", now); } else { log!(warn, "💸 Failed to create snapshot at {:?}.", now); @@ -1210,10 +1222,13 @@ decl_module! { } else { log!(warn, "💸 Estimating next session change failed."); } + add_weight(0, 0, T::NextNewSession::weight(now)) } - - // weight - 50_000 + // For `era_election_status`, `is_current_session_final`, `will_era_be_forced` + add_weight(3, 0, 0); + // Additional read from `on_finalize` + add_weight(1, 0, 0); + consumed_weight } /// Check if the current block number is the one at which the election window has been set @@ -1241,9 +1256,11 @@ decl_module! { if active_era.start.is_none() { let now_as_millis_u64 = T::UnixTime::now().as_millis().saturated_into::(); active_era.start = Some(now_as_millis_u64); + // This write only ever happens once, we don't include it in the weight in general ActiveEra::put(active_era); } } + // `on_finalize` weight is tracked in `on_initialize` } /// Take the origin account as a stash and lock up `value` of its balance. `controller` will @@ -1262,8 +1279,13 @@ decl_module! { /// /// NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned /// unless the `origin` falls below _existential deposit_ and gets removed as dust. + /// ------------------ + /// Base Weight: 67.87 µs + /// DB Weight: + /// - Read: Bonded, Ledger, [Origin Account], Current Era, History Depth, Locks + /// - Write: Bonded, Payee, [Origin Account], Locks, Ledger /// # - #[weight = 500_000_000] + #[weight = 67 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(5, 4)] pub fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, @@ -1326,8 +1348,13 @@ decl_module! { /// - Independent of the arguments. Insignificant complexity. /// - O(1). /// - One DB entry. + /// ------------ + /// Base Weight: 54.88 µs + /// DB Weight: + /// - Read: Era Election Status, Bonded, Ledger, [Origin Account], Locks + /// - Write: [Origin Account], Locks, Ledger /// # - #[weight = 500_000_000] + #[weight = 55 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(4, 2)] fn bond_extra(origin, #[compact] max_additional: BalanceOf) { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let stash = ensure_signed(origin)?; @@ -1372,8 +1399,13 @@ decl_module! { /// The only way to clean the aforementioned storage item is also user-controlled via /// `withdraw_unbonded`. /// - One DB entry. + /// ---------- + /// Base Weight: 50.34 µs + /// DB Weight: + /// - Read: Era Election Status, Ledger, Current Era, Locks, [Origin Account] + /// - Write: [Origin Account], Locks, Ledger /// - #[weight = 400_000_000] + #[weight = 50 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(4, 2)] fn unbond(origin, #[compact] value: BalanceOf) { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let controller = ensure_signed(origin)?; @@ -1420,9 +1452,28 @@ decl_module! { /// indirectly user-controlled. See [`unbond`] for more detail. /// - Contains a limited number of reads, yet the size of which could be large based on `ledger`. /// - Writes are limited to the `origin` account key. + /// --------------- + /// Complexity O(S) where S is the number of slashing spans to remove + /// Base Weight: + /// Update: 50.52 + .028 * S µs + /// - Reads: EraElectionStatus, Ledger, Current Era, Locks, [Origin Account] + /// - Writes: [Origin Account], Locks, Ledger + /// Kill: 79.41 + 2.366 * S µs + /// - Reads: EraElectionStatus, Ledger, Current Era, Bonded, Slashing Spans, [Origin Account], Locks + /// - Writes: Bonded, Slashing Spans (if S > 0), Ledger, Payee, Validators, Nominators, [Origin Account], Locks + /// - Writes Each: SpanSlash * S + /// NOTE: Weight annotation is the kill scenario, we refund otherwise. /// # - #[weight = 400_000_000] - fn withdraw_unbonded(origin) { + #[weight = T::DbWeight::get().reads_writes(6, 6) + .saturating_add(80 * WEIGHT_PER_MICROS) + .saturating_add( + (2 * WEIGHT_PER_MICROS).saturating_mul(Weight::from(*num_slashing_spans)) + ) + .saturating_add(T::DbWeight::get().writes(Weight::from(*num_slashing_spans))) + // if slashing spans is non-zero, add 1 more write + .saturating_add(T::DbWeight::get().writes(Weight::from(*num_slashing_spans).min(1))) + ] + fn withdraw_unbonded(origin, num_slashing_spans: u32) -> DispatchResultWithPostInfo { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let controller = ensure_signed(origin)?; let mut ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; @@ -1431,17 +1482,21 @@ decl_module! { ledger = ledger.consolidate_unlocked(current_era) } - if ledger.unlocking.is_empty() && ledger.active.is_zero() { + let post_info_weight = if ledger.unlocking.is_empty() && ledger.active.is_zero() { // This account must have called `unbond()` with some value that caused the active // portion to fall below existential deposit + will have no more unlocking chunks // left. We can now safely remove all staking-related information. - Self::kill_stash(&stash)?; + Self::kill_stash(&stash, num_slashing_spans)?; // remove the lock. T::Currency::remove_lock(STAKING_ID, &stash); + // This is worst case scenario, so we use the full weight and return None + None } else { // This was the consequence of a partial unbond. just update the ledger and move on. Self::update_ledger(&controller, &ledger); - } + // This is only an update, so we use less overall weight + Some(50 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(4, 2)) + }; // `old_total` should never be less than the new total because // `consolidate_unlocked` strictly subtracts balance. @@ -1450,6 +1505,8 @@ decl_module! { let value = old_total - ledger.total; Self::deposit_event(RawEvent::Withdrawn(stash, value)); } + + Ok(post_info_weight.into()) } /// Declare the desire to validate for the origin controller. @@ -1463,8 +1520,13 @@ decl_module! { /// - Independent of the arguments. Insignificant complexity. /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. + /// ----------- + /// Base Weight: 17.13 µs + /// DB Weight: + /// - Read: Era Election Status, Ledger + /// - Write: Nominators, Validators /// # - #[weight = 750_000_000] + #[weight = 17 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] pub fn validate(origin, prefs: ValidatorPrefs) { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let controller = ensure_signed(origin)?; @@ -1483,11 +1545,20 @@ decl_module! { /// And, it can be only called when [`EraElectionStatus`] is `Closed`. /// /// # - /// - The transaction's complexity is proportional to the size of `targets`, - /// which is capped at CompactAssignments::LIMIT. + /// - The transaction's complexity is proportional to the size of `targets` (N) + /// which is capped at CompactAssignments::LIMIT (MAX_NOMINATIONS). /// - Both the reads and writes follow a similar pattern. + /// --------- + /// Base Weight: 22.34 + .36 * N µs + /// where N is the number of targets + /// DB Weight: + /// - Reads: Era Election Status, Ledger, Current Era + /// - Writes: Validators, Nominators /// # - #[weight = 750_000_000] + #[weight = T::DbWeight::get().reads_writes(3, 2) + .saturating_add(22 * WEIGHT_PER_MICROS) + .saturating_add((360 * WEIGHT_PER_NANOS).saturating_mul(targets.len() as Weight)) + ] pub fn nominate(origin, targets: Vec<::Source>) { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let controller = ensure_signed(origin)?; @@ -1495,7 +1566,7 @@ decl_module! { let stash = &ledger.stash; ensure!(!targets.is_empty(), Error::::EmptyTargets); let targets = targets.into_iter() - .take(::LIMIT) + .take(MAX_NOMINATIONS) .map(|t| T::Lookup::lookup(t)) .collect::, _>>()?; @@ -1521,8 +1592,13 @@ decl_module! { /// - Independent of the arguments. Insignificant complexity. /// - Contains one read. /// - Writes are limited to the `origin` account key. + /// -------- + /// Base Weight: 16.53 µs + /// DB Weight: + /// - Read: EraElectionStatus, Ledger + /// - Write: Validators, Nominators /// # - #[weight = 500_000_000] + #[weight = 16 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] fn chill(origin) { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let controller = ensure_signed(origin)?; @@ -1540,8 +1616,13 @@ decl_module! { /// - Independent of the arguments. Insignificant complexity. /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. + /// --------- + /// - Base Weight: 11.33 µs + /// - DB Weight: + /// - Read: Ledger + /// - Write: Payee /// # - #[weight = 500_000_000] + #[weight = 11 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(1, 1)] fn set_payee(origin, payee: RewardDestination) { let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; @@ -1559,8 +1640,13 @@ decl_module! { /// - Independent of the arguments. Insignificant complexity. /// - Contains a limited number of reads. /// - Writes are limited to the `origin` account key. + /// ---------- + /// Base Weight: 25.22 µs + /// DB Weight: + /// - Read: Bonded, Ledger New Controller, Ledger Old Controller + /// - Write: Bonded, Ledger New Controller, Ledger Old Controller /// # - #[weight = 750_000_000] + #[weight = 25 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(3, 3)] fn set_controller(origin, controller: ::Source) { let stash = ensure_signed(origin)?; let old_controller = Self::bonded(&stash).ok_or(Error::::NotStash)?; @@ -1576,8 +1662,15 @@ decl_module! { } } - /// The ideal number of validators. - #[weight = 5_000_000] + /// Sets the ideal number of validators. + /// + /// The dispatch origin must be Root. + /// + /// # + /// Base Weight: 1.717 µs + /// Write: Validator Count + /// # + #[weight = 2 * WEIGHT_PER_MICROS + T::DbWeight::get().writes(1)] fn set_validator_count(origin, #[compact] new: u32) { ensure_root(origin)?; ValidatorCount::put(new); @@ -1585,10 +1678,14 @@ decl_module! { /// Force there to be no new eras indefinitely. /// + /// The dispatch origin must be Root. + /// /// # /// - No arguments. + /// - Base Weight: 1.857 µs + /// - Write: ForceEra /// # - #[weight = 5_000_000] + #[weight = 2 * WEIGHT_PER_MICROS + T::DbWeight::get().writes(1)] fn force_no_eras(origin) { ensure_root(origin)?; ForceEra::put(Forcing::ForceNone); @@ -1597,29 +1694,62 @@ decl_module! { /// Force there to be a new era at the end of the next session. After this, it will be /// reset to normal (non-forced) behaviour. /// + /// The dispatch origin must be Root. + /// /// # /// - No arguments. + /// - Base Weight: 1.959 µs + /// - Write ForceEra /// # - #[weight = 5_000_000] + #[weight = 2 * WEIGHT_PER_MICROS + T::DbWeight::get().writes(1)] fn force_new_era(origin) { ensure_root(origin)?; ForceEra::put(Forcing::ForceNew); } /// Set the validators who cannot be slashed (if any). - #[weight = 5_000_000] + /// + /// The dispatch origin must be Root. + /// + /// # + /// - O(V) + /// - Base Weight: 2.208 + .006 * V µs + /// - Write: Invulnerables + /// # + #[weight = T::DbWeight::get().writes(1) + .saturating_add(2 * WEIGHT_PER_MICROS) + .saturating_add((6 * WEIGHT_PER_NANOS).saturating_mul(validators.len() as Weight)) + ] fn set_invulnerables(origin, validators: Vec) { ensure_root(origin)?; >::put(validators); } /// Force a current staker to become completely unstaked, immediately. - #[weight = 0] - fn force_unstake(origin, stash: T::AccountId) { + /// + /// The dispatch origin must be Root. + /// + /// # + /// O(S) where S is the number of slashing spans to be removed + /// Base Weight: 53.07 + 2.365 * S µs + /// Reads: Bonded, Slashing Spans, Account, Locks + /// Writes: Bonded, Slashing Spans (if S > 0), Ledger, Payee, Validators, Nominators, Account, Locks + /// Writes Each: SpanSlash * S + /// # + #[weight = T::DbWeight::get().reads_writes(4, 7) + .saturating_add(53 * WEIGHT_PER_MICROS) + .saturating_add( + WEIGHT_PER_MICROS.saturating_mul(2).saturating_mul(Weight::from(*num_slashing_spans)) + ) + .saturating_add(T::DbWeight::get().writes(Weight::from(*num_slashing_spans))) + // if slashing spans is non-zero, add 1 more write + .saturating_add(T::DbWeight::get().writes(Weight::from(*num_slashing_spans > 0))) + ] + fn force_unstake(origin, stash: T::AccountId, num_slashing_spans: u32) { ensure_root(origin)?; // remove all staking-related information. - Self::kill_stash(&stash)?; + Self::kill_stash(&stash, num_slashing_spans)?; // remove the lock. T::Currency::remove_lock(STAKING_ID, &stash); @@ -1627,23 +1757,36 @@ decl_module! { /// Force there to be a new era at the end of sessions indefinitely. /// + /// The dispatch origin must be Root. + /// /// # - /// - One storage write + /// - Base Weight: 2.05 µs + /// - Write: ForceEra /// # - #[weight = 5_000_000] + #[weight = 2 * WEIGHT_PER_MICROS + T::DbWeight::get().writes(1)] fn force_new_era_always(origin) { ensure_root(origin)?; ForceEra::put(Forcing::ForceAlways); } - /// Cancel enactment of a deferred slash. Can be called by either the root origin or - /// the `T::SlashCancelOrigin`. - /// passing the era and indices of the slashes for that era to kill. + /// Cancel enactment of a deferred slash. + /// + /// Can be called by either the root origin or the `T::SlashCancelOrigin`. + /// + /// Parameters: era and indices of the slashes for that era to kill. /// /// # - /// - One storage write. + /// Complexity: O(U + S) + /// with U unapplied slashes weighted with U=1000 + /// and S is the number of slash indices to be canceled. + /// - Base: 5870 + 34.61 * S µs + /// - Read: Unapplied Slashes + /// - Write: Unapplied Slashes /// # - #[weight = 1_000_000_000] + #[weight = T::DbWeight::get().reads_writes(1, 1) + .saturating_add(5_870 * WEIGHT_PER_MICROS) + .saturating_add((35 * WEIGHT_PER_MICROS).saturating_mul(slash_indices.len() as Weight)) + ] fn cancel_deferred_slash(origin, era: EraIndex, slash_indices: Vec) { T::SlashCancelOrigin::try_origin(origin) .map(|_| ()) @@ -1741,8 +1884,23 @@ decl_module! { /// # /// - Time complexity: at most O(MaxNominatorRewardedPerValidator). /// - Contains a limited number of reads and writes. + /// ----------- + /// N is the Number of payouts for the validator (including the validator) + /// Base Weight: 110 + 54.2 * N µs (Median Slopes) + /// DB Weight: + /// - Read: EraElectionStatus, CurrentEra, HistoryDepth, MigrateEra, ErasValidatorReward, + /// ErasStakersClipped, ErasRewardPoints, ErasValidatorPrefs (8 items) + /// - Read Each: Bonded, Ledger, Payee, Locks, System Account (5 items) + /// - Write Each: System Account, Locks, Ledger (3 items) + // TODO: Remove read on Migrate Era /// # - #[weight = 500_000_000] + #[weight = + 110 * WEIGHT_PER_MICROS + + 54 * WEIGHT_PER_MICROS * Weight::from(T::MaxNominatorRewardedPerValidator::get()) + + T::DbWeight::get().reads(8) + + T::DbWeight::get().reads(5) * Weight::from(T::MaxNominatorRewardedPerValidator::get() + 1) + + T::DbWeight::get().writes(3) * Weight::from(T::MaxNominatorRewardedPerValidator::get() + 1) + ] fn payout_stakers(origin, validator_stash: T::AccountId, era: EraIndex) -> DispatchResult { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); ensure_signed(origin)?; @@ -1755,11 +1913,21 @@ decl_module! { /// [`EraElectionStatus`] is `Closed`. /// /// # - /// - Time complexity: O(1). Bounded by `MAX_UNLOCKING_CHUNKS`. + /// - Time complexity: O(L), where L is unlocking chunks + /// - Bounded by `MAX_UNLOCKING_CHUNKS`. /// - Storage changes: Can't increase storage, only decrease it. + /// --------------- + /// - Base Weight: 34.51 µs * .048 L µs + /// - DB Weight: + /// - Reads: EraElectionStatus, Ledger, Locks, [Origin Account] + /// - Writes: [Origin Account], Locks, Ledger /// # - #[weight = 500_000_000] - fn rebond(origin, #[compact] value: BalanceOf) { + #[weight = + 35 * WEIGHT_PER_MICROS + + 50 * WEIGHT_PER_NANOS * (MAX_UNLOCKING_CHUNKS as Weight) + + T::DbWeight::get().reads_writes(3, 2) + ] + fn rebond(origin, #[compact] value: BalanceOf) -> DispatchResultWithPostInfo { ensure!(Self::era_election_status().is_closed(), Error::::CallNotAllowed); let controller = ensure_signed(origin)?; let ledger = Self::ledger(&controller).ok_or(Error::::NotController)?; @@ -1767,13 +1935,44 @@ decl_module! { let ledger = ledger.rebond(value); Self::update_ledger(&controller, &ledger); + Ok(Some( + 35 * WEIGHT_PER_MICROS + + 50 * WEIGHT_PER_NANOS * (ledger.unlocking.len() as Weight) + + T::DbWeight::get().reads_writes(3, 2) + ).into()) } - /// Set history_depth value. + /// Set `HistoryDepth` value. This function will delete any history information + /// when `HistoryDepth` is reduced. + /// + /// Parameters: + /// - `new_history_depth`: The new history depth you would like to set. + /// - `era_items_deleted`: The number of items that will be deleted by this dispatch. + /// This should report all the storage items that will be deleted by clearing old + /// era history. Needed to report an accurate weight for the dispatch. Trusted by + /// `Root` to report an accurate number. /// /// Origin must be root. - #[weight = (500_000_000, DispatchClass::Operational)] - fn set_history_depth(origin, #[compact] new_history_depth: EraIndex) { + /// + /// # + /// - E: Number of history depths removed, i.e. 10 -> 7 = 3 + /// - Base Weight: 29.13 * E µs + /// - DB Weight: + /// - Reads: Current Era, History Depth + /// - Writes: History Depth + /// - Clear Prefix Each: Era Stakers, EraStakersClipped, ErasValidatorPrefs + /// - Writes Each: ErasValidatorReward, ErasRewardPoints, ErasTotalStake, ErasStartSessionIndex + /// # + #[weight = { + let items = Weight::from(*_era_items_deleted); + T::DbWeight::get().reads_writes(2, 1) + .saturating_add(T::DbWeight::get().reads_writes(items, items)) + + }] + fn set_history_depth(origin, + #[compact] new_history_depth: EraIndex, + #[compact] _era_items_deleted: u32, + ) { ensure_root(origin)?; if let Some(current_era) = Self::current_era() { HistoryDepth::mutate(|history_depth| { @@ -1794,10 +1993,27 @@ decl_module! { /// This can be called from any origin. /// /// - `stash`: The stash account to reap. Its balance must be zero. - #[weight = 0] - fn reap_stash(_origin, stash: T::AccountId) { + /// + /// # + /// Complexity: O(S) where S is the number of slashing spans on the account. + /// Base Weight: 75.94 + 2.396 * S µs + /// DB Weight: + /// - Reads: Stash Account, Bonded, Slashing Spans, Locks + /// - Writes: Bonded, Slashing Spans (if S > 0), Ledger, Payee, Validators, Nominators, Stash Account, Locks + /// - Writes Each: SpanSlash * S + /// # + #[weight = T::DbWeight::get().reads_writes(4, 7) + .saturating_add(76 * WEIGHT_PER_MICROS) + .saturating_add( + WEIGHT_PER_MICROS.saturating_mul(2).saturating_mul(Weight::from(*num_slashing_spans)) + ) + .saturating_add(T::DbWeight::get().writes(Weight::from(*num_slashing_spans))) + // if slashing spans is non-zero, add 1 more write + .saturating_add(T::DbWeight::get().writes(Weight::from(*num_slashing_spans).min(1))) + ] + fn reap_stash(_origin, stash: T::AccountId, num_slashing_spans: u32) { ensure!(T::Currency::total_balance(&stash).is_zero(), Error::::FundedTarget); - Self::kill_stash(&stash)?; + Self::kill_stash(&stash, num_slashing_spans)?; T::Currency::remove_lock(STAKING_ID, &stash); } @@ -1939,12 +2155,18 @@ impl Module { /// /// This data is used to efficiently evaluate election results. returns `true` if the operation /// is successful. - fn create_stakers_snapshot() -> bool { + fn create_stakers_snapshot() -> (bool, Weight) { + let mut consumed_weight = 0; + let mut add_db_reads_writes = |reads, writes| { + consumed_weight += T::DbWeight::get().reads_writes(reads, writes); + }; let validators = >::iter().map(|(v, _)| v).collect::>(); let mut nominators = >::iter().map(|(n, _)| n).collect::>(); let num_validators = validators.len(); let num_nominators = nominators.len(); + add_db_reads_writes((num_validators + num_nominators) as Weight, 0); + if num_validators > MAX_VALIDATORS || num_nominators.saturating_add(num_validators) > MAX_NOMINATORS @@ -1957,14 +2179,15 @@ impl Module { num_nominators, MAX_NOMINATORS, ); - false + (false, consumed_weight) } else { // all validators nominate themselves; nominators.extend(validators.clone()); >::put(validators); >::put(nominators); - true + add_db_reads_writes(0, 2); + (true, consumed_weight) } } @@ -2804,16 +3027,18 @@ impl Module { /// This is called: /// - after a `withdraw_unbond()` call that frees all of a stash's bonded balance. /// - through `reap_stash()` if the balance has fallen to zero (through slashing). - fn kill_stash(stash: &T::AccountId) -> DispatchResult { - let controller = Bonded::::take(stash).ok_or(Error::::NotStash)?; + fn kill_stash(stash: &T::AccountId, num_slashing_spans: u32) -> DispatchResult { + let controller = Bonded::::get(stash).ok_or(Error::::NotStash)?; + + slashing::clear_stash_metadata::(stash, num_slashing_spans)?; + + Bonded::::remove(stash); >::remove(&controller); >::remove(stash); >::remove(stash); >::remove(stash); - slashing::clear_stash_metadata::(stash); - system::Module::::dec_ref(stash); Ok(()) diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index b09d026eb3..9c908f6145 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -27,7 +27,7 @@ use frame_support::{ assert_ok, impl_outer_origin, parameter_types, impl_outer_dispatch, impl_outer_event, StorageValue, StorageMap, StorageDoubleMap, IterableStorageMap, traits::{Currency, Get, FindAuthor, OnFinalize, OnInitialize}, - weights::Weight, + weights::{Weight, constants::RocksDbWeight}, }; use sp_io; use sp_phragmen::{ @@ -36,7 +36,7 @@ use sp_phragmen::{ }; use crate::*; -const INIT_TIMESTAMP: u64 = 30_000; +pub const INIT_TIMESTAMP: u64 = 30_000; /// The AccountId alias in this test module. pub(crate) type AccountId = u64; @@ -211,7 +211,7 @@ impl frame_system::Trait for Test { type Event = MetaEvent; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); + type DbWeight = RocksDbWeight; type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); type AvailableBlockRatio = AvailableBlockRatio; @@ -763,6 +763,18 @@ pub(crate) fn on_offence_now( on_offence_in_era(offenders, slash_fraction, now) } +pub(crate) fn add_slash(who: &AccountId) { + on_offence_now( + &[ + OffenceDetails { + offender: (who.clone(), Staking::eras_stakers(Staking::active_era().unwrap().index, who.clone())), + reporters: vec![], + }, + ], + &[Perbill::from_percent(10)], + ); +} + // winners will be chosen by simply their unweighted total backing stake. Nominator stake is // distributed evenly. pub(crate) fn horrible_phragmen_with_post_processing( diff --git a/frame/staking/src/slashing.rs b/frame/staking/src/slashing.rs index 26f0828989..7dccf24cb2 100644 --- a/frame/staking/src/slashing.rs +++ b/frame/staking/src/slashing.rs @@ -50,11 +50,11 @@ use super::{ EraIndex, Trait, Module, Store, BalanceOf, Exposure, Perbill, SessionInterface, - NegativeImbalanceOf, UnappliedSlash, + NegativeImbalanceOf, UnappliedSlash, Error, }; -use sp_runtime::{traits::{Zero, Saturating}, RuntimeDebug}; +use sp_runtime::{traits::{Zero, Saturating}, RuntimeDebug, DispatchResult}; use frame_support::{ - StorageMap, StorageDoubleMap, + StorageMap, StorageDoubleMap, ensure, traits::{Currency, OnUnbalanced, Imbalance}, }; use sp_std::vec::Vec; @@ -100,7 +100,7 @@ pub struct SlashingSpans { impl SlashingSpans { // creates a new record of slashing spans for a stash, starting at the beginning // of the bonding period, relative to now. - fn new(window_start: EraIndex) -> Self { + pub(crate) fn new(window_start: EraIndex) -> Self { SlashingSpans { span_index: 0, last_start: window_start, @@ -115,7 +115,7 @@ impl SlashingSpans { // update the slashing spans to reflect the start of a new span at the era after `now` // returns `true` if a new span was started, `false` otherwise. `false` indicates // that internal state is unchanged. - fn end_span(&mut self, now: EraIndex) -> bool { + pub(crate) fn end_span(&mut self, now: EraIndex) -> bool { let next_start = now + 1; if next_start <= self.last_start { return false } @@ -547,12 +547,19 @@ pub(crate) fn clear_era_metadata(obsolete_era: EraIndex) { } /// Clear slashing metadata for a dead account. -pub(crate) fn clear_stash_metadata(stash: &T::AccountId) { - let spans = match as Store>::SlashingSpans::take(stash) { - None => return, +pub(crate) fn clear_stash_metadata( + stash: &T::AccountId, + num_slashing_spans: u32, +) -> DispatchResult { + let spans = match as Store>::SlashingSpans::get(stash) { + None => return Ok(()), Some(s) => s, }; + ensure!(num_slashing_spans as usize >= spans.iter().count(), Error::::IncorrectSlashingSpans); + + as Store>::SlashingSpans::remove(stash); + // kill slashing-span metadata for account. // // this can only happen while the account is staked _if_ they are completely slashed. @@ -561,6 +568,8 @@ pub(crate) fn clear_stash_metadata(stash: &T::AccountId) { for span in spans.iter() { as Store>::SpanSlash::remove(&(stash.clone(), span.index)); } + + Ok(()) } // apply the slash to a stash account, deducting any missing funds from the reward diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 9cda151b70..637f8a32dd 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -24,7 +24,7 @@ use sp_runtime::{ use sp_staking::offence::OffenceDetails; use frame_support::{ assert_ok, assert_noop, StorageMap, - traits::{Currency, ReservableCurrency, OnInitialize}, + traits::{Currency, ReservableCurrency, OnInitialize, OnFinalize}, }; use pallet_balances::Error as BalancesError; use substrate_test_utils::assert_eq_uvec; @@ -34,15 +34,19 @@ fn force_unstake_works() { ExtBuilder::default().build_and_execute(|| { // Account 11 is stashed and locked, and account 10 is the controller assert_eq!(Staking::bonded(&11), Some(10)); + // Adds 2 slashing spans + add_slash(&11); // Cant transfer assert_noop!( Balances::transfer(Origin::signed(11), 1, 10), BalancesError::::LiquidityRestrictions ); // Force unstake requires root. - assert_noop!(Staking::force_unstake(Origin::signed(11), 11), BadOrigin); + assert_noop!(Staking::force_unstake(Origin::signed(11), 11, 2), BadOrigin); + // Force unstake needs correct number of slashing spans (for weight calculation) + assert_noop!(Staking::force_unstake(Origin::signed(11), 11, 0), BadOrigin); // We now force them to unstake - assert_ok!(Staking::force_unstake(Origin::ROOT, 11)); + assert_ok!(Staking::force_unstake(Origin::ROOT, 11, 2)); // No longer bonded. assert_eq!(Staking::bonded(&11), None); // Transfer works. @@ -50,6 +54,24 @@ fn force_unstake_works() { }); } +#[test] +fn kill_stash_works() { + ExtBuilder::default().build_and_execute(|| { + // Account 11 is stashed and locked, and account 10 is the controller + assert_eq!(Staking::bonded(&11), Some(10)); + // Adds 2 slashing spans + add_slash(&11); + // Only can kill a stash account + assert_noop!(Staking::kill_stash(&12, 0), Error::::NotStash); + // Respects slashing span count + assert_noop!(Staking::kill_stash(&11, 0), Error::::IncorrectSlashingSpans); + // Correct inputs, everything works + assert_ok!(Staking::kill_stash(&11, 2)); + // No longer bonded. + assert_eq!(Staking::bonded(&11), None); + }); +} + #[test] fn basic_setup_works() { // Verifies initial conditions of mock @@ -1023,7 +1045,10 @@ fn bond_extra_and_withdraw_unbonded_works() { unlocking: vec![], claimed_rewards: vec![], })); - assert_eq!(Staking::eras_stakers(Staking::active_era().unwrap().index, 11), Exposure { total: 1000, own: 1000, others: vec![] }); + assert_eq!( + Staking::eras_stakers(Staking::active_era().unwrap().index, 11), + Exposure { total: 1000, own: 1000, others: vec![] } + ); // deposit the extra 100 units Staking::bond_extra(Origin::signed(11), 100).unwrap(); @@ -1036,7 +1061,10 @@ fn bond_extra_and_withdraw_unbonded_works() { claimed_rewards: vec![], })); // Exposure is a snapshot! only updated after the next era update. - assert_ne!(Staking::eras_stakers(Staking::active_era().unwrap().index, 11), Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] }); + assert_ne!( + Staking::eras_stakers(Staking::active_era().unwrap().index, 11), + Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] } + ); // trigger next era. mock::start_era(2); @@ -1051,34 +1079,68 @@ fn bond_extra_and_withdraw_unbonded_works() { claimed_rewards: vec![], })); // Exposure is now updated. - assert_eq!(Staking::eras_stakers(Staking::active_era().unwrap().index, 11), Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] }); + assert_eq!( + Staking::eras_stakers(Staking::active_era().unwrap().index, 11), + Exposure { total: 1000 + 100, own: 1000 + 100, others: vec![] } + ); // Unbond almost all of the funds in stash. Staking::unbond(Origin::signed(10), 1000).unwrap(); - assert_eq!(Staking::ledger(&10), Some(StakingLedger { - stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}], claimed_rewards: vec![] }) + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000 + 100, + active: 100, + unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}], + claimed_rewards: vec![] + }), ); // Attempting to free the balances now will fail. 2 eras need to pass. - Staking::withdraw_unbonded(Origin::signed(10)).unwrap(); - assert_eq!(Staking::ledger(&10), Some(StakingLedger { - stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}], claimed_rewards: vec![] })); + assert_ok!(Staking::withdraw_unbonded(Origin::signed(10), 0)); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000 + 100, + active: 100, + unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}], + claimed_rewards: vec![] + }), + ); // trigger next era. mock::start_era(3); // nothing yet - Staking::withdraw_unbonded(Origin::signed(10)).unwrap(); - assert_eq!(Staking::ledger(&10), Some(StakingLedger { - stash: 11, total: 1000 + 100, active: 100, unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}], claimed_rewards: vec![] })); + assert_ok!(Staking::withdraw_unbonded(Origin::signed(10), 0)); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 1000 + 100, + active: 100, + unlocking: vec![UnlockChunk{ value: 1000, era: 2 + 3}], + claimed_rewards: vec![] + }), + ); // trigger next era. mock::start_era(5); - Staking::withdraw_unbonded(Origin::signed(10)).unwrap(); + assert_ok!(Staking::withdraw_unbonded(Origin::signed(10), 0)); // Now the value is free and the staking ledger is updated. - assert_eq!(Staking::ledger(&10), Some(StakingLedger { - stash: 11, total: 100, active: 100, unlocking: vec![], claimed_rewards: vec![] })); + assert_eq!( + Staking::ledger(&10), + Some(StakingLedger { + stash: 11, + total: 100, + active: 100, + unlocking: vec![], + claimed_rewards: vec![] + }), + ); }) } @@ -1101,7 +1163,7 @@ fn too_many_unbond_calls_should_not_work() { assert_noop!(Staking::unbond(Origin::signed(10), 1), Error::::NoMoreChunks); // free up. - assert_ok!(Staking::withdraw_unbonded(Origin::signed(10))); + assert_ok!(Staking::withdraw_unbonded(Origin::signed(10), 0)); // Can add again. assert_ok!(Staking::unbond(Origin::signed(10), 1)); @@ -1449,7 +1511,7 @@ fn on_free_balance_zero_stash_removes_validator() { assert_eq!(Balances::total_balance(&11), 0); // Reap the stash - assert_ok!(Staking::reap_stash(Origin::NONE, 11)); + assert_ok!(Staking::reap_stash(Origin::NONE, 11, 0)); // Check storage items do not exist assert!(!>::contains_key(&10)); @@ -1505,7 +1567,7 @@ fn on_free_balance_zero_stash_removes_nominator() { assert_eq!(Balances::total_balance(&11), 0); // Reap the stash - assert_ok!(Staking::reap_stash(Origin::NONE, 11)); + assert_ok!(Staking::reap_stash(Origin::NONE, 11, 0)); // Check storage items do not exist assert!(!>::contains_key(&10)); @@ -1619,14 +1681,14 @@ fn bond_with_no_staked_value() { mock::start_era(2); // not yet removed. - assert_ok!(Staking::withdraw_unbonded(Origin::signed(2))); + assert_ok!(Staking::withdraw_unbonded(Origin::signed(2), 0)); assert!(Staking::ledger(2).is_some()); assert_eq!(Balances::locks(&1)[0].amount, 5); mock::start_era(3); // poof. Account 1 is removed from the staking system. - assert_ok!(Staking::withdraw_unbonded(Origin::signed(2))); + assert_ok!(Staking::withdraw_unbonded(Origin::signed(2), 0)); assert!(Staking::ledger(2).is_none()); assert_eq!(Balances::locks(&1).len(), 0); }); @@ -2270,7 +2332,12 @@ fn garbage_collection_after_slashing() { assert_eq!(Balances::free_balance(11), 0); assert_eq!(Balances::total_balance(&11), 0); - assert_ok!(Staking::reap_stash(Origin::NONE, 11)); + let slashing_spans = ::SlashingSpans::get(&11).unwrap(); + assert_eq!(slashing_spans.iter().count(), 2); + + // reap_stash respects num_slashing_spans so that weight is accurate + assert_noop!(Staking::reap_stash(Origin::NONE, 11, 0), Error::::IncorrectSlashingSpans); + assert_ok!(Staking::reap_stash(Origin::NONE, 11, 2)); assert!(::SlashingSpans::get(&11).is_none()); assert_eq!(::SpanSlash::get(&(11, 0)).amount_slashed(), &0); @@ -2705,7 +2772,7 @@ mod offchain_phragmen { /// setup a new set of validators and nominator storage items independent of the parent mock /// file. This produces a edge graph that can be reduced. - fn build_offchain_phragmen_test_ext() { + pub fn build_offchain_phragmen_test_ext() { for i in (10..=40).step_by(10) { // Note: we respect the convention of the mock (10, 11 pairs etc.) since these accounts // have corresponding keys in session which makes everything more ergonomic and @@ -4092,16 +4159,16 @@ fn test_max_nominator_rewarded_per_validator_and_cant_steal_someone_else_reward( fn set_history_depth_works() { ExtBuilder::default().build_and_execute(|| { mock::start_era(10); - Staking::set_history_depth(Origin::ROOT, 20).unwrap(); + Staking::set_history_depth(Origin::ROOT, 20, 0).unwrap(); assert!(::ErasTotalStake::contains_key(10 - 4)); assert!(::ErasTotalStake::contains_key(10 - 5)); - Staking::set_history_depth(Origin::ROOT, 4).unwrap(); + Staking::set_history_depth(Origin::ROOT, 4, 0).unwrap(); assert!(::ErasTotalStake::contains_key(10 - 4)); assert!(!::ErasTotalStake::contains_key(10 - 5)); - Staking::set_history_depth(Origin::ROOT, 3).unwrap(); + Staking::set_history_depth(Origin::ROOT, 3, 0).unwrap(); assert!(!::ErasTotalStake::contains_key(10 - 4)); assert!(!::ErasTotalStake::contains_key(10 - 5)); - Staking::set_history_depth(Origin::ROOT, 8).unwrap(); + Staking::set_history_depth(Origin::ROOT, 8, 0).unwrap(); assert!(!::ErasTotalStake::contains_key(10 - 4)); assert!(!::ErasTotalStake::contains_key(10 - 5)); }); @@ -4598,3 +4665,36 @@ fn migrate_era_should_handle_errors_2() { assert_eq_error_rate!(Balances::total_balance(&101), init_balance_101, 2); }); } + +#[test] +fn on_initialize_weight_is_correct() { + ExtBuilder::default().has_stakers(false).build_and_execute(|| { + assert_eq!(Validators::::iter().count(), 0); + assert_eq!(Nominators::::iter().count(), 0); + // When this pallet has nothing, we do 4 reads each block + let base_weight = ::DbWeight::get().reads(4); + assert_eq!(base_weight, Staking::on_initialize(0)); + }); + + ExtBuilder::default() + .offchain_phragmen_ext() + .validator_count(4) + .has_stakers(false) + .build() + .execute_with(|| { + crate::tests::offchain_phragmen::build_offchain_phragmen_test_ext(); + run_to_block(11); + Staking::on_finalize(System::block_number()); + System::set_block_number((System::block_number() + 1).into()); + Timestamp::set_timestamp(System::block_number() * 1000 + INIT_TIMESTAMP); + Session::on_initialize(System::block_number()); + + assert_eq!(Validators::::iter().count(), 4); + assert_eq!(Nominators::::iter().count(), 5); + // With 4 validators and 5 nominator, we should increase weight by: + // - (4 + 5) reads + // - 3 Writes + let final_weight = ::DbWeight::get().reads_writes(4 + 9, 3); + assert_eq!(final_weight, Staking::on_initialize(System::block_number())); + }); +} diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index 0230937fc4..bd03720220 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -29,6 +29,7 @@ use sp_runtime::{ }; use crate::dispatch::Parameter; use crate::storage::StorageMap; +use crate::weights::Weight; use impl_trait_for_tuples::impl_for_tuples; /// An abstraction of a value stored within storage, but possibly as part of a larger composite @@ -147,12 +148,19 @@ pub trait EstimateNextSessionRotation { /// /// None should be returned if the estimation fails to come to an answer fn estimate_next_session_rotation(now: BlockNumber) -> Option; + + /// Return the weight of calling `estimate_next_session_rotation` + fn weight(now: BlockNumber) -> Weight; } impl EstimateNextSessionRotation for () { fn estimate_next_session_rotation(_: BlockNumber) -> Option { Default::default() } + + fn weight(_: BlockNumber) -> Weight { + 0 + } } /// Something that can estimate at which block the next `new_session` will be triggered. This must @@ -160,12 +168,19 @@ impl EstimateNextSessionRotation for () { pub trait EstimateNextNewSession { /// Return the block number at which the next new session is estimated to happen. fn estimate_next_new_session(now: BlockNumber) -> Option; + + /// Return the weight of calling `estimate_next_new_session` + fn weight(now: BlockNumber) -> Weight; } impl EstimateNextNewSession for () { fn estimate_next_new_session(_: BlockNumber) -> Option { Default::default() } + + fn weight(_: BlockNumber) -> Weight { + 0 + } } /// Anything that can have a `::len()` method. -- GitLab From d9ec920f37bdc4225b01e88a3e307f5cb1822922 Mon Sep 17 00:00:00 2001 From: Andrew Plaza Date: Fri, 15 May 2020 11:17:39 +0200 Subject: [PATCH 052/150] bump kvdb-* versions (#6017) --- Cargo.lock | 31 ++++++++++++------------------- bin/node/bench/Cargo.toml | 4 ++-- bin/node/bench/src/tempdb.rs | 9 +++------ client/api/Cargo.toml | 4 ++-- client/db/Cargo.toml | 8 ++++---- primitives/database/Cargo.toml | 2 +- utils/browser/Cargo.toml | 2 +- 7 files changed, 25 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0060543e01..d7b0556bfd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2280,12 +2280,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" -[[package]] -name = "interleaved-ordered" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "141340095b15ed7491bd3d4ced9d20cebfb826174b6bb03386381f62b01e3d77" - [[package]] name = "intervalier" version = "0.4.0" @@ -2496,9 +2490,9 @@ dependencies = [ [[package]] name = "kvdb" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad096c6849b2ef027fabe35c4aed356d0e3d3f586d0a8361e5e17f1e50a7ce5" +checksum = "e763b2a9b500ba47948061d1e8bc3b5f03a8a1f067dbcf822a4d2c84d2b54a3a" dependencies = [ "parity-util-mem", "smallvec 1.3.0", @@ -2506,9 +2500,9 @@ dependencies = [ [[package]] name = "kvdb-memorydb" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa954d12cfac958822dfd77aab34f3eec71f103b918c4ab79ab59a36ee594ea" +checksum = "73027d5e228de6f503b5b7335d530404fc26230a6ae3e09b33ec6e45408509a4" dependencies = [ "kvdb", "parity-util-mem", @@ -2517,12 +2511,11 @@ dependencies = [ [[package]] name = "kvdb-rocksdb" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3f14c3a10c8894d26175e57e9e26032e6d6c49c30cbe2468c5bf5f6b64bb0be" +checksum = "84384eca250c7ff67877eda5336f28a86586aaee24acb945643590671f6bfce1" dependencies = [ "fs-swap", - "interleaved-ordered", "kvdb", "log", "num_cpus", @@ -2536,9 +2529,9 @@ dependencies = [ [[package]] name = "kvdb-web" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26f96eec962af83cdf7c83036b3dbb0ae6a1249ddab746820618e2567ca8ebcd" +checksum = "6c7f36acb1841d4c701d30ae1f2cfd242e805991443f75f6935479ed3de64903" dependencies = [ "futures 0.3.4", "js-sys", @@ -3020,9 +3013,9 @@ dependencies = [ [[package]] name = "librocksdb-sys" -version = "6.6.4" +version = "6.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3b727e2dd20ec2fb7ed93f23d9fd5328a0871185485ebdaff007b47d3e27e4" +checksum = "883213ae3d09bfc3d104aefe94b25ebb183b6f4d3a515b23b14817e1f4854005" dependencies = [ "bindgen", "cc", @@ -5702,9 +5695,9 @@ dependencies = [ [[package]] name = "rocksdb" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12069b106981c6103d3eab7dd1c86751482d0779a520b7c14954c8b586c1e643" +checksum = "61aa17a99a2413cd71c1106691bf59dad7de0cd5099127f90e9d99c429c40d4a" dependencies = [ "libc", "librocksdb-sys", diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index 809600b99f..9dc000d446 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -20,8 +20,8 @@ serde = "1.0.101" serde_json = "1.0.41" structopt = "0.3" derive_more = "0.99.2" -kvdb = "0.5" -kvdb-rocksdb = "0.7" +kvdb = "0.6" +kvdb-rocksdb = "0.8" sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } hash-db = "0.15.2" diff --git a/bin/node/bench/src/tempdb.rs b/bin/node/bench/src/tempdb.rs index 4a0a793a22..69544a3802 100644 --- a/bin/node/bench/src/tempdb.rs +++ b/bin/node/bench/src/tempdb.rs @@ -41,17 +41,14 @@ impl KeyValueDB for ParityDbWrapper { } /// Write a transaction of changes to the buffer. - fn write_buffered(&self, transaction: DBTransaction) { + fn write(&self, transaction: DBTransaction) -> io::Result<()> { self.0.commit( transaction.ops.iter().map(|op| match op { kvdb::DBOp::Insert { col, key, value } => (*col as u8, &key[key.len() - 32..], Some(value.to_vec())), kvdb::DBOp::Delete { col, key } => (*col as u8, &key[key.len() - 32..], None), + kvdb::DBOp::DeletePrefix { col: _, prefix: _ } => unimplemented!() }) ).expect("db error"); - } - - /// Flush all buffered data. - fn flush(&self) -> io::Result<()> { Ok(()) } @@ -61,7 +58,7 @@ impl KeyValueDB for ParityDbWrapper { } /// Iterate over flushed data for a given column, starting from a given prefix. - fn iter_from_prefix<'a>( + fn iter_with_prefix<'a>( &'a self, _col: u32, _prefix: &'a [u8], diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index a18068b833..1f0d5e16e6 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -25,7 +25,7 @@ sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -kvdb = "0.5.0" +kvdb = "0.6.0" log = { version = "0.4.8" } parking_lot = "0.10.0" lazy_static = "1.4.0" @@ -44,6 +44,6 @@ sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transact prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } [dev-dependencies] -kvdb-memorydb = "0.5.0" +kvdb-memorydb = "0.6.0" sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index 2df1836850..a6f97957c6 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -14,9 +14,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = "0.10.0" log = "0.4.8" -kvdb = "0.5.0" -kvdb-rocksdb = { version = "0.7", optional = true } -kvdb-memorydb = "0.5.0" +kvdb = "0.6.0" +kvdb-rocksdb = { version = "0.8", optional = true } +kvdb-memorydb = "0.6.0" linked-hash-map = "0.5.2" hash-db = "0.15.2" parity-util-mem = { version = "0.6.1", default-features = false, features = ["std"] } @@ -41,7 +41,7 @@ sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } env_logger = "0.7.0" quickcheck = "0.9" -kvdb-rocksdb = "0.7" +kvdb-rocksdb = "0.8" tempfile = "3" [features] diff --git a/primitives/database/Cargo.toml b/primitives/database/Cargo.toml index 2ab86de61d..ee5871a637 100644 --- a/primitives/database/Cargo.toml +++ b/primitives/database/Cargo.toml @@ -11,4 +11,4 @@ documentation = "https://docs.rs/sp-database" [dependencies] parking_lot = "0.10.0" -kvdb = "0.5.0" +kvdb = "0.6.0" diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 868f32e34a..beee4be5f8 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -21,7 +21,7 @@ console_log = "0.1.2" js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" -kvdb-web = "0.5" +kvdb-web = "0.6" sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } sc-informant = { version = "0.8.0-dev", path = "../../client/informant" } sc-service = { version = "0.8.0-dev", path = "../../client/service", default-features = false } -- GitLab From dbf2163250833e6ac898e7f6c3c8f89f08a7c19d Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Fri, 15 May 2020 13:21:56 +0200 Subject: [PATCH 053/150] Relax substrate licensing scheme (#5947) --- LICENSE-APACHE2 | 211 ++++++++++++++++++ LICENSE => LICENSE-GPL3 | 26 +++ README.md | 2 +- bin/node-template/node/src/command.rs | 25 ++- bin/node/bench/Cargo.toml | 2 +- bin/node/bench/src/core.rs | 14 +- bin/node/bench/src/generator.rs | 14 +- bin/node/bench/src/import.rs | 14 +- bin/node/bench/src/main.rs | 14 +- bin/node/bench/src/simple_trie.rs | 14 +- bin/node/bench/src/tempdb.rs | 14 +- bin/node/bench/src/trie.rs | 14 +- bin/node/browser-testing/Cargo.toml | 2 +- bin/node/browser-testing/src/lib.rs | 25 ++- bin/node/cli/Cargo.toml | 2 +- bin/node/cli/bin/main.rs | 14 +- bin/node/cli/build.rs | 14 +- bin/node/cli/src/browser.rs | 14 +- bin/node/cli/src/chain_spec.rs | 14 +- bin/node/cli/src/cli.rs | 14 +- bin/node/cli/src/command.rs | 14 +- bin/node/cli/src/lib.rs | 14 +- bin/node/cli/src/service.rs | 14 +- bin/node/cli/tests/build_spec_works.rs | 14 +- bin/node/cli/tests/check_block_works.rs | 14 +- bin/node/cli/tests/common.rs | 14 +- .../tests/import_export_and_revert_work.rs | 14 +- bin/node/cli/tests/inspect_works.rs | 14 +- bin/node/cli/tests/purge_chain_works.rs | 14 +- .../tests/running_the_node_and_interrupt.rs | 14 +- bin/node/cli/tests/version.rs | 14 +- bin/node/executor/Cargo.toml | 2 +- bin/node/executor/benches/bench.rs | 27 +-- bin/node/executor/src/lib.rs | 25 ++- bin/node/executor/tests/basic.rs | 27 +-- bin/node/executor/tests/common.rs | 27 +-- bin/node/executor/tests/fees.rs | 27 +-- bin/node/executor/tests/submit_transaction.rs | 27 +-- bin/node/inspect/Cargo.toml | 2 +- bin/node/inspect/src/cli.rs | 14 +- bin/node/inspect/src/command.rs | 14 +- bin/node/inspect/src/lib.rs | 20 +- bin/node/primitives/Cargo.toml | 2 +- bin/node/primitives/src/lib.rs | 27 +-- bin/node/rpc-client/Cargo.toml | 2 +- bin/node/rpc-client/src/main.rs | 25 ++- bin/node/rpc/Cargo.toml | 2 +- bin/node/rpc/src/lib.rs | 27 +-- bin/node/runtime/Cargo.toml | 2 +- bin/node/runtime/build.rs | 25 ++- bin/node/runtime/src/constants.rs | 25 ++- bin/node/runtime/src/impls.rs | 27 +-- bin/node/runtime/src/lib.rs | 16 +- bin/node/testing/Cargo.toml | 2 +- bin/node/testing/src/bench.rs | 14 +- bin/node/testing/src/client.rs | 14 +- bin/node/testing/src/genesis.rs | 14 +- bin/node/testing/src/keyring.rs | 14 +- bin/node/testing/src/lib.rs | 14 +- bin/utils/chain-spec-builder/Cargo.toml | 2 +- bin/utils/chain-spec-builder/build.rs | 14 +- bin/utils/chain-spec-builder/src/main.rs | 14 +- bin/utils/subkey/Cargo.toml | 2 +- bin/utils/subkey/src/main.rs | 14 +- bin/utils/subkey/src/rpc.rs | 14 +- bin/utils/subkey/src/vanity.rs | 14 +- client/api/Cargo.toml | 2 +- client/api/src/backend.rs | 14 +- client/api/src/call_executor.rs | 15 +- client/api/src/cht.rs | 15 +- client/api/src/in_mem.rs | 15 +- client/api/src/leaves.rs | 15 +- client/api/src/notifications.rs | 15 +- client/api/src/proof_provider.rs | 15 +- client/authority-discovery/Cargo.toml | 2 +- client/authority-discovery/src/tests.rs | 15 +- client/basic-authorship/Cargo.toml | 2 +- .../basic-authorship/src/basic_authorship.rs | 15 +- client/basic-authorship/src/lib.rs | 15 +- client/block-builder/Cargo.toml | 2 +- client/block-builder/src/lib.rs | 15 +- client/chain-spec/Cargo.toml | 2 +- client/chain-spec/derive/Cargo.toml | 2 +- client/chain-spec/src/chain_spec.rs | 15 +- client/cli/Cargo.toml | 2 +- client/cli/src/arg_enums.rs | 15 +- client/cli/src/commands/build_spec_cmd.rs | 15 +- client/cli/src/commands/check_block_cmd.rs | 15 +- client/cli/src/commands/export_blocks_cmd.rs | 15 +- client/cli/src/commands/export_state_cmd.rs | 15 +- client/cli/src/commands/import_blocks_cmd.rs | 15 +- client/cli/src/commands/mod.rs | 15 +- client/cli/src/commands/purge_chain_cmd.rs | 15 +- client/cli/src/commands/revert_cmd.rs | 15 +- client/cli/src/commands/run_cmd.rs | 15 +- client/cli/src/config.rs | 15 +- client/cli/src/error.rs | 15 +- client/cli/src/lib.rs | 15 +- client/cli/src/params/database_params.rs | 15 +- client/cli/src/params/import_params.rs | 15 +- client/cli/src/params/keystore_params.rs | 15 +- client/cli/src/params/mod.rs | 15 +- client/cli/src/params/network_params.rs | 15 +- client/cli/src/params/node_key_params.rs | 15 +- .../cli/src/params/offchain_worker_params.rs | 15 +- client/cli/src/params/pruning_params.rs | 15 +- client/cli/src/params/shared_params.rs | 15 +- .../cli/src/params/transaction_pool_params.rs | 15 +- client/cli/src/runner.rs | 15 +- client/consensus/aura/Cargo.toml | 2 +- client/consensus/aura/src/digests.rs | 15 +- client/consensus/aura/src/lib.rs | 14 +- client/consensus/babe/Cargo.toml | 2 +- client/consensus/babe/rpc/Cargo.toml | 2 +- client/consensus/babe/rpc/src/lib.rs | 15 +- client/consensus/common/Cargo.toml | 2 +- client/consensus/epochs/Cargo.toml | 2 +- client/consensus/manual-seal/Cargo.toml | 2 +- client/consensus/manual-seal/src/error.rs | 15 +- client/consensus/manual-seal/src/lib.rs | 15 +- client/consensus/pow/Cargo.toml | 2 +- client/consensus/pow/src/lib.rs | 15 +- client/consensus/slots/Cargo.toml | 2 +- client/consensus/uncles/Cargo.toml | 2 +- client/db/Cargo.toml | 2 +- client/db/src/bench.rs | 15 +- client/db/src/cache/list_cache.rs | 15 +- client/db/src/cache/list_entry.rs | 15 +- client/db/src/cache/list_storage.rs | 15 +- client/db/src/cache/mod.rs | 15 +- client/db/src/lib.rs | 15 +- client/db/src/light.rs | 15 +- client/db/src/offchain.rs | 15 +- client/db/src/parity_db.rs | 15 +- client/db/src/stats.rs | 15 +- client/db/src/subdb.rs | 15 +- client/db/src/utils.rs | 15 +- client/executor/Cargo.toml | 2 +- client/executor/common/Cargo.toml | 2 +- client/executor/common/src/error.rs | 15 +- client/executor/common/src/sandbox.rs | 15 +- client/executor/common/src/util.rs | 15 +- client/executor/runtime-test/Cargo.toml | 2 +- client/executor/src/integration_tests/mod.rs | 15 +- .../executor/src/integration_tests/sandbox.rs | 15 +- client/executor/src/lib.rs | 15 +- client/executor/src/native_executor.rs | 15 +- client/executor/wasmi/Cargo.toml | 2 +- client/executor/wasmtime/Cargo.toml | 2 +- client/executor/wasmtime/src/imports.rs | 15 +- .../executor/wasmtime/src/instance_wrapper.rs | 15 +- .../src/instance_wrapper/globals_snapshot.rs | 15 +- client/executor/wasmtime/src/state_holder.rs | 15 +- client/finality-grandpa/Cargo.toml | 2 +- client/finality-grandpa/rpc/Cargo.toml | 2 +- client/finality-grandpa/rpc/src/error.rs | 15 +- client/finality-grandpa/rpc/src/lib.rs | 15 +- client/finality-grandpa/rpc/src/report.rs | 15 +- client/finality-grandpa/src/authorities.rs | 15 +- .../finality-grandpa/src/communication/mod.rs | 15 +- client/finality-grandpa/src/environment.rs | 15 +- client/finality-grandpa/src/finality_proof.rs | 15 +- client/finality-grandpa/src/import.rs | 15 +- client/finality-grandpa/src/justification.rs | 15 +- client/finality-grandpa/src/lib.rs | 15 +- client/finality-grandpa/src/observer.rs | 15 +- client/finality-grandpa/src/tests.rs | 15 +- client/finality-grandpa/src/until_imported.rs | 15 +- client/finality-grandpa/src/voting_rule.rs | 15 +- client/informant/Cargo.toml | 2 +- client/informant/src/lib.rs | 15 +- client/keystore/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network-gossip/src/state_machine.rs | 15 +- client/network-gossip/src/validator.rs | 15 +- client/network/Cargo.toml | 2 +- client/network/src/chain.rs | 15 +- client/network/src/config.rs | 15 +- client/network/src/error.rs | 15 +- client/network/src/lib.rs | 15 +- client/network/src/network_state.rs | 15 +- client/network/src/on_demand_layer.rs | 15 +- client/network/src/protocol.rs | 15 +- .../src/protocol/generic_proto/handler.rs | 15 +- .../generic_proto/handler/notif_in.rs | 15 +- .../src/protocol/generic_proto/upgrade.rs | 15 +- .../protocol/generic_proto/upgrade/legacy.rs | 15 +- client/network/src/protocol/message.rs | 15 +- client/network/src/protocol/sync/blocks.rs | 15 +- .../src/protocol/sync/extra_requests.rs | 15 +- client/network/src/schema.rs | 15 +- client/network/src/service.rs | 15 +- client/network/src/service/out_events.rs | 15 +- client/network/src/service/tests.rs | 15 +- client/network/src/transport.rs | 15 +- client/network/test/Cargo.toml | 2 +- client/network/test/src/block_import.rs | 15 +- client/network/test/src/lib.rs | 15 +- client/network/test/src/sync.rs | 15 +- client/offchain/Cargo.toml | 2 +- client/peerset/Cargo.toml | 2 +- client/peerset/src/lib.rs | 15 +- client/peerset/tests/fuzz.rs | 15 +- client/rpc-api/Cargo.toml | 2 +- client/rpc-api/src/author/error.rs | 15 +- client/rpc-api/src/author/mod.rs | 15 +- client/rpc-api/src/chain/error.rs | 15 +- client/rpc-api/src/chain/mod.rs | 15 +- client/rpc-api/src/child_state/mod.rs | 15 +- client/rpc-api/src/errors.rs | 15 +- client/rpc-api/src/helpers.rs | 15 +- client/rpc-api/src/offchain/error.rs | 15 +- client/rpc-api/src/offchain/mod.rs | 15 +- client/rpc-api/src/policy.rs | 15 +- client/rpc-api/src/state/error.rs | 15 +- client/rpc-api/src/state/helpers.rs | 15 +- client/rpc-api/src/state/mod.rs | 15 +- client/rpc-api/src/subscriptions.rs | 15 +- client/rpc-api/src/system/error.rs | 15 +- client/rpc-api/src/system/helpers.rs | 15 +- client/rpc-api/src/system/mod.rs | 15 +- client/rpc-servers/Cargo.toml | 2 +- client/rpc-servers/src/lib.rs | 15 +- client/rpc/Cargo.toml | 2 +- client/rpc/src/author/mod.rs | 15 +- client/rpc/src/author/tests.rs | 15 +- client/rpc/src/chain/mod.rs | 15 +- client/rpc/src/chain/tests.rs | 15 +- client/rpc/src/lib.rs | 15 +- client/rpc/src/metadata.rs | 15 +- client/rpc/src/offchain/mod.rs | 15 +- client/rpc/src/offchain/tests.rs | 15 +- client/rpc/src/state/mod.rs | 15 +- client/rpc/src/state/tests.rs | 15 +- client/rpc/src/system/mod.rs | 15 +- client/rpc/src/system/tests.rs | 15 +- client/rpc/src/testing.rs | 14 +- client/service/Cargo.toml | 2 +- client/service/src/builder.rs | 15 +- client/service/src/chain_ops.rs | 15 +- client/service/src/client/block_rules.rs | 15 +- client/service/src/client/call_executor.rs | 15 +- client/service/src/client/client.rs | 15 +- client/service/src/client/genesis.rs | 15 +- client/service/src/client/light/backend.rs | 14 +- client/service/src/client/light/blockchain.rs | 15 +- .../service/src/client/light/call_executor.rs | 15 +- client/service/src/client/light/fetcher.rs | 15 +- client/service/src/client/light/mod.rs | 15 +- client/service/src/client/mod.rs | 15 +- client/service/src/config.rs | 15 +- client/service/src/error.rs | 15 +- client/service/src/lib.rs | 15 +- client/service/src/metrics.rs | 15 +- client/service/test/Cargo.toml | 2 +- client/service/test/src/client/db.rs | 15 +- client/service/test/src/client/light.rs | 15 +- client/service/test/src/client/mod.rs | 15 +- client/service/test/src/lib.rs | 15 +- client/state-db/Cargo.toml | 2 +- client/state-db/src/lib.rs | 15 +- client/state-db/src/noncanonical.rs | 15 +- client/state-db/src/pruning.rs | 15 +- client/state-db/src/test.rs | 15 +- client/telemetry/Cargo.toml | 2 +- client/telemetry/src/lib.rs | 15 +- client/telemetry/src/worker.rs | 15 +- client/telemetry/src/worker/node.rs | 15 +- client/tracing/Cargo.toml | 2 +- client/transaction-pool/Cargo.toml | 2 +- client/transaction-pool/graph/Cargo.toml | 2 +- .../transaction-pool/graph/benches/basics.rs | 15 +- .../transaction-pool/graph/src/base_pool.rs | 15 +- client/transaction-pool/graph/src/error.rs | 15 +- client/transaction-pool/graph/src/future.rs | 15 +- client/transaction-pool/graph/src/lib.rs | 15 +- client/transaction-pool/graph/src/listener.rs | 15 +- client/transaction-pool/graph/src/pool.rs | 15 +- client/transaction-pool/graph/src/ready.rs | 15 +- client/transaction-pool/graph/src/rotator.rs | 15 +- .../graph/src/validated_pool.rs | 15 +- client/transaction-pool/graph/src/watcher.rs | 15 +- client/transaction-pool/src/api.rs | 15 +- client/transaction-pool/src/error.rs | 15 +- client/transaction-pool/src/lib.rs | 15 +- client/transaction-pool/src/metrics.rs | 15 +- client/transaction-pool/src/revalidation.rs | 15 +- client/transaction-pool/src/testing/mod.rs | 15 +- client/transaction-pool/src/testing/pool.rs | 15 +- frame/assets/Cargo.toml | 2 +- frame/assets/src/lib.rs | 27 +-- frame/aura/Cargo.toml | 2 +- frame/aura/src/lib.rs | 27 +-- frame/aura/src/mock.rs | 25 ++- frame/aura/src/tests.rs | 25 ++- frame/authority-discovery/Cargo.toml | 2 +- frame/authority-discovery/src/lib.rs | 27 +-- frame/authorship/Cargo.toml | 2 +- frame/authorship/src/lib.rs | 27 +-- frame/babe/Cargo.toml | 2 +- frame/babe/src/lib.rs | 25 ++- frame/babe/src/mock.rs | 27 +-- frame/babe/src/tests.rs | 27 +-- frame/balances/Cargo.toml | 2 +- frame/balances/src/benchmarking.rs | 27 +-- frame/balances/src/lib.rs | 27 +-- frame/balances/src/tests.rs | 27 +-- frame/balances/src/tests_composite.rs | 25 ++- frame/balances/src/tests_local.rs | 25 ++- frame/benchmark/Cargo.toml | 2 +- frame/benchmark/src/benchmarking.rs | 27 +-- frame/benchmark/src/lib.rs | 27 +-- frame/benchmarking/Cargo.toml | 2 +- frame/benchmarking/src/analysis.rs | 25 ++- frame/benchmarking/src/lib.rs | 27 +-- frame/benchmarking/src/tests.rs | 27 +-- frame/benchmarking/src/utils.rs | 27 +-- frame/collective/Cargo.toml | 2 +- frame/collective/src/benchmarking.rs | 27 +-- frame/collective/src/lib.rs | 27 +-- frame/contracts/Cargo.toml | 2 +- frame/contracts/common/Cargo.toml | 2 +- frame/contracts/rpc/Cargo.toml | 2 +- frame/contracts/rpc/runtime-api/Cargo.toml | 2 +- frame/contracts/rpc/runtime-api/src/lib.rs | 25 ++- frame/contracts/rpc/src/lib.rs | 27 +-- frame/democracy/Cargo.toml | 2 +- frame/democracy/src/benchmarking.rs | 27 +-- frame/democracy/src/conviction.rs | 25 ++- frame/democracy/src/lib.rs | 27 +-- frame/democracy/src/tests.rs | 25 ++- frame/democracy/src/tests/cancellation.rs | 27 +-- frame/democracy/src/tests/delegation.rs | 27 +-- .../democracy/src/tests/external_proposing.rs | 25 ++- frame/democracy/src/tests/fast_tracking.rs | 25 ++- frame/democracy/src/tests/lock_voting.rs | 27 +-- frame/democracy/src/tests/preimage.rs | 27 +-- frame/democracy/src/tests/proxying.rs | 27 +-- frame/democracy/src/tests/public_proposals.rs | 25 ++- frame/democracy/src/tests/scheduling.rs | 27 +-- frame/democracy/src/tests/voting.rs | 27 +-- frame/democracy/src/types.rs | 27 +-- frame/democracy/src/vote.rs | 27 +-- frame/democracy/src/vote_threshold.rs | 25 ++- frame/elections-phragmen/Cargo.toml | 2 +- frame/elections-phragmen/src/lib.rs | 27 +-- frame/elections/Cargo.toml | 2 +- frame/elections/src/lib.rs | 25 ++- frame/elections/src/mock.rs | 25 ++- frame/elections/src/tests.rs | 27 +-- frame/evm/Cargo.toml | 2 +- frame/evm/src/lib.rs | 27 +-- frame/example-offchain-worker/src/lib.rs | 27 +-- frame/example-offchain-worker/src/tests.rs | 27 +-- frame/example/src/lib.rs | 25 ++- frame/executive/Cargo.toml | 2 +- frame/executive/src/lib.rs | 27 +-- frame/finality-tracker/Cargo.toml | 2 +- frame/finality-tracker/src/lib.rs | 27 +-- frame/generic-asset/Cargo.toml | 2 +- frame/grandpa/Cargo.toml | 2 +- frame/grandpa/src/equivocation.rs | 27 +-- frame/grandpa/src/lib.rs | 27 +-- frame/grandpa/src/mock.rs | 27 +-- frame/grandpa/src/tests.rs | 27 +-- frame/identity/Cargo.toml | 2 +- frame/identity/src/benchmarking.rs | 27 +-- frame/identity/src/lib.rs | 27 +-- frame/im-online/Cargo.toml | 2 +- frame/im-online/src/benchmarking.rs | 27 +-- frame/im-online/src/lib.rs | 27 +-- frame/im-online/src/mock.rs | 27 +-- frame/im-online/src/tests.rs | 27 +-- frame/indices/Cargo.toml | 2 +- frame/indices/src/address.rs | 27 +-- frame/indices/src/lib.rs | 27 +-- frame/indices/src/mock.rs | 27 +-- frame/indices/src/tests.rs | 25 ++- frame/membership/Cargo.toml | 2 +- frame/membership/src/lib.rs | 27 +-- frame/metadata/Cargo.toml | 2 +- frame/metadata/src/lib.rs | 27 +-- frame/nicks/Cargo.toml | 2 +- frame/nicks/src/lib.rs | 27 +-- frame/offences/Cargo.toml | 2 +- frame/offences/benchmarking/Cargo.toml | 2 +- frame/offences/benchmarking/src/lib.rs | 27 +-- frame/offences/benchmarking/src/mock.rs | 27 +-- frame/offences/src/lib.rs | 27 +-- frame/offences/src/mock.rs | 27 +-- frame/offences/src/tests.rs | 27 +-- frame/randomness-collective-flip/Cargo.toml | 2 +- frame/randomness-collective-flip/src/lib.rs | 27 +-- frame/recovery/Cargo.toml | 2 +- frame/recovery/src/lib.rs | 27 +-- frame/recovery/src/mock.rs | 27 +-- frame/recovery/src/tests.rs | 25 ++- frame/scheduler/src/benchmarking.rs | 27 +-- frame/scheduler/src/lib.rs | 27 +-- frame/scored-pool/Cargo.toml | 2 +- frame/scored-pool/src/lib.rs | 27 +-- frame/scored-pool/src/mock.rs | 27 +-- frame/scored-pool/src/tests.rs | 27 +-- frame/session/Cargo.toml | 2 +- frame/session/benchmarking/Cargo.toml | 2 +- frame/session/benchmarking/src/lib.rs | 27 +-- frame/session/benchmarking/src/mock.rs | 27 +-- frame/session/src/historical.rs | 27 +-- frame/session/src/lib.rs | 27 +-- frame/session/src/mock.rs | 27 +-- frame/session/src/tests.rs | 27 +-- frame/society/Cargo.toml | 2 +- frame/society/src/lib.rs | 27 +-- frame/society/src/mock.rs | 27 +-- frame/society/src/tests.rs | 27 +-- frame/staking/Cargo.toml | 2 +- frame/staking/fuzzer/Cargo.toml | 2 +- frame/staking/fuzzer/src/mock.rs | 27 +-- frame/staking/fuzzer/src/submit_solution.rs | 27 +-- frame/staking/reward-curve/Cargo.toml | 2 +- frame/staking/reward-curve/src/lib.rs | 27 +-- frame/staking/reward-curve/tests/test.rs | 25 ++- frame/staking/src/benchmarking.rs | 27 +-- frame/staking/src/inflation.rs | 25 ++- frame/staking/src/lib.rs | 27 +-- frame/staking/src/mock.rs | 27 +-- frame/staking/src/offchain_election.rs | 27 +-- frame/staking/src/slashing.rs | 25 ++- frame/staking/src/testing_utils.rs | 27 +-- frame/staking/src/tests.rs | 27 +-- frame/sudo/Cargo.toml | 2 +- frame/sudo/src/lib.rs | 27 +-- frame/sudo/src/mock.rs | 27 +-- frame/sudo/src/tests.rs | 27 +-- frame/support/Cargo.toml | 2 +- frame/support/procedural/Cargo.toml | 2 +- .../procedural/src/construct_runtime/mod.rs | 27 +-- .../procedural/src/construct_runtime/parse.rs | 27 +-- frame/support/procedural/src/lib.rs | 25 ++- .../src/storage/genesis_config/builder_def.rs | 27 +-- .../genesis_config/genesis_config_def.rs | 27 +-- .../src/storage/genesis_config/mod.rs | 27 +-- .../support/procedural/src/storage/getters.rs | 25 ++- .../procedural/src/storage/instance_trait.rs | 27 +-- .../procedural/src/storage/metadata.rs | 27 +-- frame/support/procedural/src/storage/mod.rs | 27 +-- frame/support/procedural/src/storage/parse.rs | 27 +-- .../procedural/src/storage/storage_struct.rs | 27 +-- .../procedural/src/storage/store_trait.rs | 27 +-- frame/support/procedural/tools/Cargo.toml | 2 +- .../procedural/tools/derive/Cargo.toml | 2 +- .../procedural/tools/derive/src/lib.rs | 27 +-- frame/support/procedural/tools/src/lib.rs | 25 ++- frame/support/procedural/tools/src/syn_ext.rs | 27 +-- frame/support/src/debug.rs | 27 +-- frame/support/src/dispatch.rs | 27 +-- frame/support/src/error.rs | 25 ++- frame/support/src/hash.rs | 27 +-- frame/support/src/inherent.rs | 27 +-- frame/support/src/lib.rs | 27 +-- frame/support/src/metadata.rs | 27 +-- frame/support/src/origin.rs | 25 ++- frame/support/src/storage/child.rs | 27 +-- .../src/storage/generator/double_map.rs | 27 +-- frame/support/src/storage/generator/map.rs | 27 +-- frame/support/src/storage/generator/mod.rs | 27 +-- frame/support/src/storage/generator/value.rs | 27 +-- frame/support/src/storage/hashed.rs | 27 +-- frame/support/src/storage/migration.rs | 27 +-- frame/support/src/storage/mod.rs | 27 +-- frame/support/src/storage/unhashed.rs | 27 +-- frame/support/src/traits.rs | 27 +-- frame/support/src/unsigned.rs | 27 +-- frame/support/src/weights.rs | 27 +-- frame/support/test/Cargo.toml | 2 +- frame/support/test/src/lib.rs | 25 ++- .../test/tests/construct_runtime_ui.rs | 25 ++- frame/support/test/tests/decl_error.rs | 27 +-- frame/support/test/tests/decl_storage.rs | 27 +-- frame/support/test/tests/decl_storage_ui.rs | 25 ++- .../tests/decl_storage_ui/config_duplicate.rs | 25 ++- .../decl_storage_ui/config_duplicate.stderr | 4 +- .../decl_storage_ui/config_get_duplicate.rs | 25 ++- .../config_get_duplicate.stderr | 4 +- .../tests/decl_storage_ui/get_duplicate.rs | 25 ++- .../decl_storage_ui/get_duplicate.stderr | 4 +- frame/support/test/tests/final_keys.rs | 27 +-- frame/support/test/tests/genesisconfig.rs | 27 +-- frame/support/test/tests/instance.rs | 27 +-- frame/support/test/tests/issue2219.rs | 27 +-- frame/support/test/tests/reserved_keyword.rs | 25 ++- frame/support/test/tests/system.rs | 25 ++- frame/system/Cargo.toml | 2 +- frame/system/benches/bench.rs | 27 +-- frame/system/benchmarking/Cargo.toml | 2 +- frame/system/benchmarking/src/lib.rs | 27 +-- frame/system/benchmarking/src/mock.rs | 25 ++- frame/system/rpc/runtime-api/Cargo.toml | 2 +- frame/system/rpc/runtime-api/src/lib.rs | 25 ++- frame/system/src/lib.rs | 27 +-- frame/system/src/offchain.rs | 27 +-- frame/timestamp/Cargo.toml | 2 +- frame/timestamp/src/benchmarking.rs | 25 ++- frame/timestamp/src/lib.rs | 27 +-- frame/transaction-payment/Cargo.toml | 2 +- frame/transaction-payment/rpc/Cargo.toml | 2 +- .../rpc/runtime-api/Cargo.toml | 2 +- .../rpc/runtime-api/src/lib.rs | 27 +-- frame/transaction-payment/rpc/src/lib.rs | 25 ++- frame/transaction-payment/src/lib.rs | 27 +-- frame/treasury/Cargo.toml | 2 +- frame/treasury/src/benchmarking.rs | 27 +-- frame/treasury/src/lib.rs | 27 +-- frame/treasury/src/tests.rs | 27 +-- frame/utility/Cargo.toml | 2 +- frame/utility/src/benchmarking.rs | 27 +-- frame/utility/src/lib.rs | 27 +-- frame/utility/src/tests.rs | 27 +-- frame/vesting/Cargo.toml | 2 +- frame/vesting/src/benchmarking.rs | 27 +-- frame/vesting/src/lib.rs | 27 +-- primitives/allocator/Cargo.toml | 2 +- primitives/allocator/src/error.rs | 25 ++- primitives/allocator/src/freeing_bump.rs | 27 +-- primitives/allocator/src/lib.rs | 25 ++- primitives/api/Cargo.toml | 2 +- primitives/api/proc-macro/Cargo.toml | 2 +- .../api/proc-macro/src/decl_runtime_apis.rs | 27 +-- .../api/proc-macro/src/impl_runtime_apis.rs | 27 +-- primitives/api/proc-macro/src/lib.rs | 27 +-- .../proc-macro/src/mock_impl_runtime_apis.rs | 27 +-- primitives/api/proc-macro/src/utils.rs | 27 +-- primitives/api/src/lib.rs | 27 +-- primitives/api/test/Cargo.toml | 2 +- primitives/api/test/benches/bench.rs | 25 ++- primitives/api/test/tests/decl_and_impl.rs | 27 +-- primitives/api/test/tests/runtime_calls.rs | 27 +-- primitives/api/test/tests/trybuild.rs | 25 ++- primitives/application-crypto/Cargo.toml | 2 +- primitives/application-crypto/src/ed25519.rs | 27 +-- primitives/application-crypto/src/lib.rs | 27 +-- primitives/application-crypto/src/sr25519.rs | 27 +-- primitives/application-crypto/src/traits.rs | 27 +-- primitives/application-crypto/test/Cargo.toml | 2 +- .../application-crypto/test/src/ed25519.rs | 25 ++- primitives/application-crypto/test/src/lib.rs | 25 ++- .../application-crypto/test/src/sr25519.rs | 27 +-- primitives/arithmetic/Cargo.toml | 2 +- primitives/arithmetic/benches/bench.rs | 25 ++- primitives/arithmetic/fuzzer/Cargo.toml | 2 +- primitives/arithmetic/fuzzer/src/biguint.rs | 27 +-- .../fuzzer/src/per_thing_rational.rs | 27 +-- .../arithmetic/fuzzer/src/rational128.rs | 25 ++- primitives/arithmetic/src/biguint.rs | 27 +-- primitives/arithmetic/src/fixed128.rs | 27 +-- primitives/arithmetic/src/fixed64.rs | 27 +-- primitives/arithmetic/src/helpers_128bit.rs | 25 ++- primitives/arithmetic/src/lib.rs | 27 +-- primitives/arithmetic/src/per_things.rs | 27 +-- primitives/arithmetic/src/rational128.rs | 27 +-- primitives/arithmetic/src/traits.rs | 27 +-- primitives/authority-discovery/Cargo.toml | 2 +- primitives/authority-discovery/src/lib.rs | 27 +-- primitives/authorship/Cargo.toml | 2 +- primitives/authorship/src/lib.rs | 27 +-- primitives/block-builder/Cargo.toml | 2 +- primitives/block-builder/src/lib.rs | 27 +-- primitives/blockchain/Cargo.toml | 2 +- primitives/blockchain/src/backend.rs | 27 +-- primitives/blockchain/src/error.rs | 25 ++- primitives/blockchain/src/header_metadata.rs | 27 +-- primitives/blockchain/src/lib.rs | 25 ++- primitives/chain-spec/Cargo.toml | 2 +- primitives/chain-spec/src/lib.rs | 25 ++- primitives/consensus/aura/Cargo.toml | 2 +- primitives/consensus/aura/src/inherents.rs | 27 +-- primitives/consensus/aura/src/lib.rs | 27 +-- primitives/consensus/babe/Cargo.toml | 2 +- primitives/consensus/babe/src/digests.rs | 27 +-- primitives/consensus/babe/src/inherents.rs | 24 +- primitives/consensus/babe/src/lib.rs | 27 +-- primitives/consensus/common/Cargo.toml | 2 +- .../consensus/common/src/block_import.rs | 27 +-- primitives/consensus/common/src/error.rs | 25 ++- primitives/consensus/common/src/evaluation.rs | 27 +-- .../consensus/common/src/import_queue.rs | 25 ++- .../common/src/import_queue/basic_queue.rs | 27 +-- .../common/src/import_queue/buffered_link.rs | 27 +-- .../consensus/common/src/offline_tracker.rs | 27 +-- primitives/consensus/pow/Cargo.toml | 2 +- primitives/consensus/pow/src/lib.rs | 25 ++- primitives/consensus/vrf/Cargo.toml | 2 +- primitives/consensus/vrf/src/lib.rs | 25 ++- primitives/consensus/vrf/src/schnorrkel.rs | 27 +-- primitives/core/Cargo.toml | 2 +- primitives/core/benches/bench.rs | 1 + primitives/core/src/changes_trie.rs | 27 +-- primitives/core/src/crypto.rs | 27 +-- primitives/core/src/ecdsa.rs | 27 +-- primitives/core/src/ed25519.rs | 27 +-- primitives/core/src/hash.rs | 25 ++- primitives/core/src/hasher.rs | 27 +-- primitives/core/src/hashing.rs | 27 +-- primitives/core/src/hexdisplay.rs | 25 ++- primitives/core/src/lib.rs | 27 +-- primitives/core/src/offchain/mod.rs | 27 +-- primitives/core/src/offchain/storage.rs | 27 +-- primitives/core/src/offchain/testing.rs | 27 +-- primitives/core/src/sandbox.rs | 27 +-- primitives/core/src/sr25519.rs | 27 +-- primitives/core/src/tasks.rs | 27 +-- primitives/core/src/testing.rs | 27 +-- primitives/core/src/traits.rs | 27 +-- primitives/core/src/u32_trait.rs | 25 ++- primitives/core/src/uint.rs | 25 ++- primitives/database/Cargo.toml | 2 +- primitives/database/src/kvdb.rs | 27 +-- primitives/database/src/lib.rs | 27 +-- primitives/database/src/mem.rs | 25 ++- primitives/debug-derive/Cargo.toml | 2 +- primitives/debug-derive/src/impls.rs | 27 +-- primitives/debug-derive/src/lib.rs | 27 +-- primitives/debug-derive/tests/tests.rs | 25 ++- primitives/externalities/Cargo.toml | 2 +- primitives/externalities/src/extensions.rs | 27 +-- primitives/externalities/src/lib.rs | 27 +-- primitives/externalities/src/scope_limited.rs | 27 +-- primitives/finality-grandpa/Cargo.toml | 2 +- primitives/finality-grandpa/src/lib.rs | 27 +-- primitives/finality-tracker/Cargo.toml | 2 +- primitives/finality-tracker/src/lib.rs | 25 ++- primitives/inherents/Cargo.toml | 2 +- primitives/inherents/src/lib.rs | 27 +-- primitives/io/Cargo.toml | 2 +- primitives/io/src/batch_verifier.rs | 27 +-- primitives/io/src/lib.rs | 27 +-- primitives/keyring/Cargo.toml | 2 +- primitives/keyring/src/ed25519.rs | 27 +-- primitives/keyring/src/lib.rs | 27 +-- primitives/keyring/src/sr25519.rs | 27 +-- primitives/offchain/Cargo.toml | 2 +- primitives/offchain/src/lib.rs | 27 +-- primitives/panic-handler/Cargo.toml | 2 +- primitives/panic-handler/src/lib.rs | 27 +-- primitives/phragmen/Cargo.toml | 2 +- primitives/phragmen/benches/phragmen.rs | 1 + primitives/phragmen/compact/Cargo.toml | 2 +- primitives/phragmen/compact/src/assignment.rs | 27 +-- primitives/phragmen/compact/src/lib.rs | 27 +-- primitives/phragmen/compact/src/staked.rs | 27 +-- primitives/phragmen/fuzzer/Cargo.toml | 2 +- primitives/phragmen/fuzzer/src/common.rs | 25 ++- primitives/phragmen/fuzzer/src/equalize.rs | 27 +-- primitives/phragmen/fuzzer/src/reduce.rs | 27 +-- primitives/phragmen/src/helpers.rs | 25 ++- primitives/phragmen/src/lib.rs | 27 +-- primitives/phragmen/src/mock.rs | 27 +-- primitives/phragmen/src/node.rs | 27 +-- primitives/phragmen/src/reduce.rs | 27 +-- primitives/phragmen/src/tests.rs | 27 +-- primitives/rpc/Cargo.toml | 2 +- primitives/rpc/src/lib.rs | 27 +-- primitives/rpc/src/list.rs | 25 ++- primitives/rpc/src/number.rs | 25 ++- primitives/runtime-interface/Cargo.toml | 2 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../runtime-interface/proc-macro/src/lib.rs | 25 ++- .../proc-macro/src/pass_by/codec.rs | 27 +-- .../proc-macro/src/pass_by/enum_.rs | 27 +-- .../proc-macro/src/pass_by/inner.rs | 27 +-- .../proc-macro/src/pass_by/mod.rs | 25 ++- .../bare_function_interface.rs | 27 +-- .../host_function_interface.rs | 27 +-- .../proc-macro/src/runtime_interface/mod.rs | 27 +-- .../src/runtime_interface/trait_decl_impl.rs | 27 +-- primitives/runtime-interface/src/host.rs | 25 ++- primitives/runtime-interface/src/impls.rs | 27 +-- primitives/runtime-interface/src/lib.rs | 25 ++- primitives/runtime-interface/src/pass_by.rs | 27 +-- primitives/runtime-interface/src/util.rs | 27 +-- primitives/runtime-interface/src/wasm.rs | 27 +-- .../test-wasm-deprecated/Cargo.toml | 2 +- .../test-wasm-deprecated/build.rs | 25 ++- .../test-wasm-deprecated/src/lib.rs | 27 +-- .../runtime-interface/test-wasm/Cargo.toml | 2 +- .../runtime-interface/test-wasm/build.rs | 25 ++- .../runtime-interface/test-wasm/src/lib.rs | 27 +-- primitives/runtime-interface/test/Cargo.toml | 2 +- primitives/runtime-interface/test/src/lib.rs | 27 +-- primitives/runtime-interface/tests/ui.rs | 25 ++- primitives/runtime/Cargo.toml | 2 +- primitives/runtime/src/curve.rs | 27 +-- primitives/runtime/src/generic/block.rs | 27 +-- .../runtime/src/generic/checked_extrinsic.rs | 25 ++- primitives/runtime/src/generic/digest.rs | 27 +-- primitives/runtime/src/generic/era.rs | 27 +-- primitives/runtime/src/generic/header.rs | 27 +-- primitives/runtime/src/generic/mod.rs | 27 +-- primitives/runtime/src/generic/tests.rs | 27 +-- .../src/generic/unchecked_extrinsic.rs | 27 +-- primitives/runtime/src/lib.rs | 27 +-- primitives/runtime/src/offchain/http.rs | 27 +-- primitives/runtime/src/offchain/mod.rs | 25 ++- primitives/runtime/src/offchain/storage.rs | 27 +-- .../runtime/src/random_number_generator.rs | 25 ++- primitives/runtime/src/runtime_string.rs | 27 +-- primitives/runtime/src/testing.rs | 27 +-- primitives/runtime/src/traits.rs | 27 +-- .../runtime/src/transaction_validity.rs | 27 +-- primitives/sandbox/Cargo.toml | 2 +- primitives/sandbox/src/lib.rs | 27 +-- primitives/sandbox/with_std.rs | 27 +-- primitives/sandbox/without_std.rs | 27 +-- primitives/serializer/Cargo.toml | 2 +- primitives/serializer/src/lib.rs | 27 +-- primitives/session/Cargo.toml | 2 +- primitives/session/src/lib.rs | 25 ++- primitives/staking/Cargo.toml | 2 +- primitives/staking/src/offence.rs | 27 +-- primitives/state-machine/Cargo.toml | 2 +- primitives/state-machine/src/backend.rs | 27 +-- primitives/state-machine/src/basic.rs | 27 +-- .../state-machine/src/changes_trie/build.rs | 27 +-- .../src/changes_trie/build_cache.rs | 27 +-- .../src/changes_trie/build_iterator.rs | 27 +-- .../src/changes_trie/changes_iterator.rs | 27 +-- .../state-machine/src/changes_trie/input.rs | 27 +-- .../state-machine/src/changes_trie/mod.rs | 27 +-- .../state-machine/src/changes_trie/prune.rs | 27 +-- .../state-machine/src/changes_trie/storage.rs | 27 +-- .../src/changes_trie/surface_iterator.rs | 25 ++- primitives/state-machine/src/error.rs | 27 +-- primitives/state-machine/src/ext.rs | 27 +-- primitives/state-machine/src/lib.rs | 27 +-- .../state-machine/src/overlayed_changes.rs | 27 +-- .../state-machine/src/proving_backend.rs | 27 +-- primitives/state-machine/src/stats.rs | 25 ++- primitives/state-machine/src/testing.rs | 27 +-- primitives/state-machine/src/trie_backend.rs | 27 +-- .../state-machine/src/trie_backend_essence.rs | 27 +-- primitives/std/Cargo.toml | 2 +- primitives/std/src/lib.rs | 25 ++- primitives/std/with_std.rs | 25 ++- primitives/std/without_std.rs | 25 ++- primitives/storage/Cargo.toml | 2 +- primitives/storage/src/lib.rs | 27 +-- primitives/test-primitives/Cargo.toml | 2 +- primitives/test-primitives/src/lib.rs | 25 ++- primitives/timestamp/Cargo.toml | 2 +- primitives/timestamp/src/lib.rs | 27 +-- primitives/tracing/Cargo.toml | 2 +- primitives/tracing/src/lib.rs | 25 ++- primitives/transaction-pool/Cargo.toml | 2 +- primitives/transaction-pool/src/error.rs | 25 ++- primitives/transaction-pool/src/lib.rs | 27 +-- primitives/transaction-pool/src/pool.rs | 27 +-- .../transaction-pool/src/runtime_api.rs | 25 ++- primitives/trie/Cargo.toml | 2 +- primitives/utils/Cargo.toml | 2 +- primitives/utils/src/lib.rs | 25 ++- primitives/utils/src/metrics.rs | 27 +-- primitives/utils/src/mpsc.rs | 27 +-- primitives/version/Cargo.toml | 2 +- primitives/version/src/lib.rs | 27 +-- primitives/wasm-interface/Cargo.toml | 2 +- primitives/wasm-interface/src/lib.rs | 27 +-- primitives/wasm-interface/src/wasmi_impl.rs | 25 ++- test-utils/Cargo.toml | 2 +- test-utils/client/Cargo.toml | 2 +- test-utils/client/src/client_ext.rs | 27 +-- test-utils/client/src/lib.rs | 25 ++- test-utils/runtime/Cargo.toml | 2 +- test-utils/runtime/build.rs | 25 ++- test-utils/runtime/client/Cargo.toml | 2 +- .../runtime/client/src/block_builder_ext.rs | 25 ++- test-utils/runtime/client/src/lib.rs | 27 +-- test-utils/runtime/client/src/trait_tests.rs | 27 +-- test-utils/runtime/src/genesismap.rs | 25 ++- test-utils/runtime/src/lib.rs | 27 +-- test-utils/runtime/src/system.rs | 27 +-- .../runtime/transaction-pool/Cargo.toml | 2 +- .../runtime/transaction-pool/src/lib.rs | 27 +-- test-utils/src/lib.rs | 25 ++- utils/browser/Cargo.toml | 2 +- utils/browser/src/lib.rs | 27 +-- utils/build-script-utils/Cargo.toml | 2 +- utils/build-script-utils/src/git.rs | 27 +-- utils/build-script-utils/src/lib.rs | 25 ++- utils/build-script-utils/src/version.rs | 25 ++- utils/fork-tree/Cargo.toml | 2 +- utils/fork-tree/src/lib.rs | 27 +-- utils/frame/benchmarking-cli/Cargo.toml | 2 +- utils/frame/benchmarking-cli/src/command.rs | 27 +-- utils/frame/benchmarking-cli/src/lib.rs | 27 +-- utils/frame/rpc/support/Cargo.toml | 2 +- utils/frame/rpc/support/src/lib.rs | 25 ++- utils/frame/rpc/system/Cargo.toml | 2 +- utils/frame/rpc/system/src/lib.rs | 25 ++- utils/prometheus/Cargo.toml | 2 +- utils/prometheus/src/networking.rs | 25 ++- utils/wasm-builder-runner/Cargo.toml | 2 +- utils/wasm-builder-runner/src/lib.rs | 27 +-- utils/wasm-builder/Cargo.toml | 2 +- utils/wasm-builder/src/lib.rs | 27 +-- utils/wasm-builder/src/prerequisites.rs | 25 ++- utils/wasm-builder/src/wasm_project.rs | 27 +-- 806 files changed, 7730 insertions(+), 6822 deletions(-) create mode 100644 LICENSE-APACHE2 rename LICENSE => LICENSE-GPL3 (96%) diff --git a/LICENSE-APACHE2 b/LICENSE-APACHE2 new file mode 100644 index 0000000000..fbb0616d18 --- /dev/null +++ b/LICENSE-APACHE2 @@ -0,0 +1,211 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + NOTE + +Individual files contain the following tag instead of the full license +text. + + SPDX-License-Identifier: Apache-2.0 + +This enables machine processing of license information based on the SPDX +License Identifiers that are here available: http://spdx.org/licenses/ \ No newline at end of file diff --git a/LICENSE b/LICENSE-GPL3 similarity index 96% rename from LICENSE rename to LICENSE-GPL3 index 9cecc1d466..2ba7526ee6 100644 --- a/LICENSE +++ b/LICENSE-GPL3 @@ -672,3 +672,29 @@ may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . + + "CLASSPATH" EXCEPTION TO THE GPL + + Linking this library statically or dynamically with other modules is making +a combined work based on this library. Thus, the terms and conditions of the +GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent modules, +and to copy and distribute the resulting executable under terms of your +choice, provided that you also meet, for each linked independent module, +the terms and conditions of the license of that module. An independent +module is a module which is not derived from or based on this library. +If you modify this library, you may extend this exception to your version +of the library, but you are not obligated to do so. If you do not wish to +do so, delete this exception statement from your version. + + NOTE + + Individual files contain the following tag instead of the full license text. + + SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + + This enables machine processing of license information based on the SPDX +License Identifiers that are here available: http://spdx.org/licenses/ \ No newline at end of file diff --git a/README.md b/README.md index cd00013d1a..62ec466e0e 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,4 @@ The security policy and procedures can be found in [`docs/SECURITY.md`](docs/SEC ## License -Substrate is [GPL 3.0 licensed](LICENSE). +Substrate Client (`/client/*` / `sc-*`) is licensed under [GPL v3.0 with a classpath linking exception](LICENSE-GPL3), primitives (`sp-*`), FRAME (`frame-*`) and pallets (`pallets-*`), binaries (`/bin`) and all other utilities are licensed under [Apache 2.0](LICENSE-APACHE2). \ No newline at end of file diff --git a/bin/node-template/node/src/command.rs b/bin/node-template/node/src/command.rs index baac33e9ac..18e1b22a53 100644 --- a/bin/node-template/node/src/command.rs +++ b/bin/node-template/node/src/command.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::chain_spec; use crate::cli::Cli; diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index 9dc000d446..ec72a125bb 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate node integration benchmarks." edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/bin/node/bench/src/core.rs b/bin/node/bench/src/core.rs index db0b1180f4..ca297b1a90 100644 --- a/bin/node/bench/src/core.rs +++ b/bin/node/bench/src/core.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use std::{fmt, borrow::{Cow, ToOwned}}; use serde::Serialize; diff --git a/bin/node/bench/src/generator.rs b/bin/node/bench/src/generator.rs index 895f523497..a42dbd748f 100644 --- a/bin/node/bench/src/generator.rs +++ b/bin/node/bench/src/generator.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use std::{collections::HashMap, sync::Arc}; diff --git a/bin/node/bench/src/import.rs b/bin/node/bench/src/import.rs index a311bb1b1b..d98b54ce70 100644 --- a/bin/node/bench/src/import.rs +++ b/bin/node/bench/src/import.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Block import benchmark. //! diff --git a/bin/node/bench/src/main.rs b/bin/node/bench/src/main.rs index ed4f9fe107..fbf203d29e 100644 --- a/bin/node/bench/src/main.rs +++ b/bin/node/bench/src/main.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #[macro_use] mod core; mod import; diff --git a/bin/node/bench/src/simple_trie.rs b/bin/node/bench/src/simple_trie.rs index 50078a11df..01ad1bb9b4 100644 --- a/bin/node/bench/src/simple_trie.rs +++ b/bin/node/bench/src/simple_trie.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use std::{collections::HashMap, sync::Arc}; diff --git a/bin/node/bench/src/tempdb.rs b/bin/node/bench/src/tempdb.rs index 69544a3802..19f9b9099c 100644 --- a/bin/node/bench/src/tempdb.rs +++ b/bin/node/bench/src/tempdb.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use std::{io, sync::Arc}; use kvdb::{KeyValueDB, DBTransaction}; diff --git a/bin/node/bench/src/trie.rs b/bin/node/bench/src/trie.rs index 9a52e3c301..ada18c1016 100644 --- a/bin/node/bench/src/trie.rs +++ b/bin/node/bench/src/trie.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Trie benchmark (integrated). diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 0f2a4751a8..3885aa3b09 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Tests for the in-browser light client." edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" [dependencies] futures-timer = "3.0.2" diff --git a/bin/node/browser-testing/src/lib.rs b/bin/node/browser-testing/src/lib.rs index 65f1e4620b..c943a383ae 100644 --- a/bin/node/browser-testing/src/lib.rs +++ b/bin/node/browser-testing/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Running //! Running this test can be done with diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index de38ac66e5..281bee8dbb 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] description = "Generic Substrate node implementation in Rust." build = "build.rs" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" default-run = "substrate" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/cli/bin/main.rs b/bin/node/cli/bin/main.rs index cfad84a4cb..1d0fa639c0 100644 --- a/bin/node/cli/bin/main.rs +++ b/bin/node/cli/bin/main.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Substrate Node CLI diff --git a/bin/node/cli/build.rs b/bin/node/cli/build.rs index 12e0cab58a..1c47dadc8d 100644 --- a/bin/node/cli/build.rs +++ b/bin/node/cli/build.rs @@ -1,18 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . fn main() { #[cfg(feature = "cli")] diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index 861d37c605..df74ef3f75 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use crate::chain_spec::ChainSpec; use log::info; diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index ea3999fa37..6688c08b8a 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Substrate chain configurations. diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index fa9a43ee68..a653279064 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use sc_cli::RunCmd; use structopt::StructOpt; diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 81a22011b5..3034c81bac 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -1,18 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use crate::{chain_spec, service, Cli, Subcommand}; use node_executor::Executor; diff --git a/bin/node/cli/src/lib.rs b/bin/node/cli/src/lib.rs index 3c49f9176f..8edfb5e3fb 100644 --- a/bin/node/cli/src/lib.rs +++ b/bin/node/cli/src/lib.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Substrate CLI library. //! diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 7d6a210bee..abb446f48c 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #![warn(unused_extern_crates)] diff --git a/bin/node/cli/tests/build_spec_works.rs b/bin/node/cli/tests/build_spec_works.rs index 2eca71a5b5..a6fa2ad4e2 100644 --- a/bin/node/cli/tests/build_spec_works.rs +++ b/bin/node/cli/tests/build_spec_works.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use assert_cmd::cargo::cargo_bin; use std::process::Command; diff --git a/bin/node/cli/tests/check_block_works.rs b/bin/node/cli/tests/check_block_works.rs index 6bfb82a8bf..209b1122aa 100644 --- a/bin/node/cli/tests/check_block_works.rs +++ b/bin/node/cli/tests/check_block_works.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #![cfg(unix)] diff --git a/bin/node/cli/tests/common.rs b/bin/node/cli/tests/common.rs index 34e371195c..a9df32d792 100644 --- a/bin/node/cli/tests/common.rs +++ b/bin/node/cli/tests/common.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #![cfg(unix)] #![allow(dead_code)] diff --git a/bin/node/cli/tests/import_export_and_revert_work.rs b/bin/node/cli/tests/import_export_and_revert_work.rs index 131265e3b4..2655645617 100644 --- a/bin/node/cli/tests/import_export_and_revert_work.rs +++ b/bin/node/cli/tests/import_export_and_revert_work.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #![cfg(unix)] diff --git a/bin/node/cli/tests/inspect_works.rs b/bin/node/cli/tests/inspect_works.rs index 441b08ccf4..6787244876 100644 --- a/bin/node/cli/tests/inspect_works.rs +++ b/bin/node/cli/tests/inspect_works.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #![cfg(unix)] diff --git a/bin/node/cli/tests/purge_chain_works.rs b/bin/node/cli/tests/purge_chain_works.rs index 020259d0c5..b57084092d 100644 --- a/bin/node/cli/tests/purge_chain_works.rs +++ b/bin/node/cli/tests/purge_chain_works.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use assert_cmd::cargo::cargo_bin; use std::process::Command; diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs index 67efedccbe..fb241e177e 100644 --- a/bin/node/cli/tests/running_the_node_and_interrupt.rs +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use assert_cmd::cargo::cargo_bin; use std::{convert::TryInto, process::Command, thread, time::Duration}; diff --git a/bin/node/cli/tests/version.rs b/bin/node/cli/tests/version.rs index 6f99d7c24a..8d8b3a5ce0 100644 --- a/bin/node/cli/tests/version.rs +++ b/bin/node/cli/tests/version.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use assert_cmd::cargo::cargo_bin; use platforms::*; diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 99bd83bb4a..014ac9a4c8 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/executor/benches/bench.rs b/bin/node/executor/benches/bench.rs index 0f269c301b..ad735c8766 100644 --- a/bin/node/executor/benches/bench.rs +++ b/bin/node/executor/benches/bench.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Decode, Encode}; use criterion::{BatchSize, Criterion, criterion_group, criterion_main}; diff --git a/bin/node/executor/src/lib.rs b/bin/node/executor/src/lib.rs index bcc7f48507..4c3b82bc7d 100644 --- a/bin/node/executor/src/lib.rs +++ b/bin/node/executor/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A `CodeExecutor` specialization which uses natively compiled runtime when the wasm to be //! executed is equivalent to the natively compiled code. diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index 47d5f3f384..a8eb1bfe3d 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Encode, Decode, Joiner}; use frame_support::{ diff --git a/bin/node/executor/tests/common.rs b/bin/node/executor/tests/common.rs index e888c269cc..9f4d9f71e7 100644 --- a/bin/node/executor/tests/common.rs +++ b/bin/node/executor/tests/common.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Encode, Decode}; use frame_system::offchain::AppCrypto; diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs index c7d6bb34cd..77db2ca669 100644 --- a/bin/node/executor/tests/fees.rs +++ b/bin/node/executor/tests/fees.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Encode, Joiner}; use frame_support::{ diff --git a/bin/node/executor/tests/submit_transaction.rs b/bin/node/executor/tests/submit_transaction.rs index 7ebee2658b..b3fc25e6cd 100644 --- a/bin/node/executor/tests/submit_transaction.rs +++ b/bin/node/executor/tests/submit_transaction.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use node_runtime::{ Executive, Indices, Runtime, UncheckedExtrinsic, diff --git a/bin/node/inspect/Cargo.toml b/bin/node/inspect/Cargo.toml index 03d3a94b62..5beb1f948e 100644 --- a/bin/node/inspect/Cargo.toml +++ b/bin/node/inspect/Cargo.toml @@ -3,7 +3,7 @@ name = "node-inspect" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/inspect/src/cli.rs b/bin/node/inspect/src/cli.rs index 5d51bd5848..3a71407ab0 100644 --- a/bin/node/inspect/src/cli.rs +++ b/bin/node/inspect/src/cli.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Structs to easily compose inspect sub-command for CLI. diff --git a/bin/node/inspect/src/command.rs b/bin/node/inspect/src/command.rs index 2212907f76..c409aee86e 100644 --- a/bin/node/inspect/src/command.rs +++ b/bin/node/inspect/src/command.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Command ran by the CLI diff --git a/bin/node/inspect/src/lib.rs b/bin/node/inspect/src/lib.rs index b8101d98a3..5123fc5959 100644 --- a/bin/node/inspect/src/lib.rs +++ b/bin/node/inspect/src/lib.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. - -// Substrate is free software: you can redistribute it and/or modify +// +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 +// +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, +// +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. - +// // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! A CLI extension for substrate node, adding sub-command to pretty print debug info //! about blocks and extrinsics. diff --git a/bin/node/primitives/Cargo.toml b/bin/node/primitives/Cargo.toml index e69b626b54..5850db83d4 100644 --- a/bin/node/primitives/Cargo.toml +++ b/bin/node/primitives/Cargo.toml @@ -3,7 +3,7 @@ name = "node-primitives" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/primitives/src/lib.rs b/bin/node/primitives/src/lib.rs index 6e02e68add..137fb1d94c 100644 --- a/bin/node/primitives/src/lib.rs +++ b/bin/node/primitives/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Low-level types used throughout the Substrate code. diff --git a/bin/node/rpc-client/Cargo.toml b/bin/node/rpc-client/Cargo.toml index 1df3590d1f..8ba5aed4aa 100644 --- a/bin/node/rpc-client/Cargo.toml +++ b/bin/node/rpc-client/Cargo.toml @@ -3,7 +3,7 @@ name = "node-rpc-client" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/rpc-client/src/main.rs b/bin/node/rpc-client/src/main.rs index c547d30002..eadd1c8d47 100644 --- a/bin/node/rpc-client/src/main.rs +++ b/bin/node/rpc-client/src/main.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #![warn(missing_docs)] diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index f0c5fc250b..ef948cd009 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -3,7 +3,7 @@ name = "node-rpc" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/rpc/src/lib.rs b/bin/node/rpc/src/lib.rs index 114179c004..02cb44d402 100644 --- a/bin/node/rpc/src/lib.rs +++ b/bin/node/rpc/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A collection of node-specific RPC methods. //! diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index bae21fd6c8..8ca89367fe 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/node/runtime/build.rs b/bin/node/runtime/build.rs index 647b476814..cd5db582f3 100644 --- a/bin/node/runtime/build.rs +++ b/bin/node/runtime/build.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use wasm_builder_runner::WasmBuilder; diff --git a/bin/node/runtime/src/constants.rs b/bin/node/runtime/src/constants.rs index bf12492f8d..45f1ab19a4 100644 --- a/bin/node/runtime/src/constants.rs +++ b/bin/node/runtime/src/constants.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A set of constant values used in substrate runtime. diff --git a/bin/node/runtime/src/impls.rs b/bin/node/runtime/src/impls.rs index 878d4b6f0c..ef994392b5 100644 --- a/bin/node/runtime/src/impls.rs +++ b/bin/node/runtime/src/impls.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Some configurable implementations as associated type for the substrate runtime. diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 85fce74ed9..da99617f1c 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! The Substrate runtime. This can be compiled with ``#[no_std]`, ready for Wasm. @@ -92,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 248, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index af375c774d..dded81ac8e 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Test utilities for Substrate node." edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = true diff --git a/bin/node/testing/src/bench.rs b/bin/node/testing/src/bench.rs index 4355d0e44d..888ec71cda 100644 --- a/bin/node/testing/src/bench.rs +++ b/bin/node/testing/src/bench.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Benchmarking module. //! diff --git a/bin/node/testing/src/client.rs b/bin/node/testing/src/client.rs index 69583e37dc..5d2795a6f6 100644 --- a/bin/node/testing/src/client.rs +++ b/bin/node/testing/src/client.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Utilities to build a `TestClient` for `node-runtime`. diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index 0f72d2c547..f99b559a25 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Genesis Configuration. diff --git a/bin/node/testing/src/keyring.rs b/bin/node/testing/src/keyring.rs index 2b1d6f985a..99a44e065d 100644 --- a/bin/node/testing/src/keyring.rs +++ b/bin/node/testing/src/keyring.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Test accounts. diff --git a/bin/node/testing/src/lib.rs b/bin/node/testing/src/lib.rs index 6a06d31801..07859f5fed 100644 --- a/bin/node/testing/src/lib.rs +++ b/bin/node/testing/src/lib.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! A set of testing utilities for Substrate Node. diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index a6c2b671fe..211460400c 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/utils/chain-spec-builder/build.rs b/bin/utils/chain-spec-builder/build.rs index 513cc234d4..cf8afddb54 100644 --- a/bin/utils/chain-spec-builder/build.rs +++ b/bin/utils/chain-spec-builder/build.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use std::env; diff --git a/bin/utils/chain-spec-builder/src/main.rs b/bin/utils/chain-spec-builder/src/main.rs index 1440187014..1561b3a6b0 100644 --- a/bin/utils/chain-spec-builder/src/main.rs +++ b/bin/utils/chain-spec-builder/src/main.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use std::{fs, path::{Path, PathBuf}}; diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 7f50f4546c..488b0f7fbc 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -3,7 +3,7 @@ name = "subkey" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index dd618393c3..da4f59430f 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . #![cfg_attr(feature = "bench", feature(test))] #[cfg(feature = "bench")] diff --git a/bin/utils/subkey/src/rpc.rs b/bin/utils/subkey/src/rpc.rs index e08ccc19a2..c6c63be4d1 100644 --- a/bin/utils/subkey/src/rpc.rs +++ b/bin/utils/subkey/src/rpc.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Helper to run commands against current node RPC diff --git a/bin/utils/subkey/src/vanity.rs b/bin/utils/subkey/src/vanity.rs index f921470946..83a71659d8 100644 --- a/bin/utils/subkey/src/vanity.rs +++ b/bin/utils/subkey/src/vanity.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . use super::{PublicOf, PublicT, Crypto}; use sp_core::Pair; diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 1f0d5e16e6..9e983eb966 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-client-api" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate client interfaces." diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index 8aaeb94483..fd9577695a 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -1,18 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Substrate Client data backend diff --git a/client/api/src/call_executor.rs b/client/api/src/call_executor.rs index 00711e83b7..8c69eb8caa 100644 --- a/client/api/src/call_executor.rs +++ b/client/api/src/call_executor.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A method call executor interface. use std::{panic::UnwindSafe, result, cell::RefCell}; diff --git a/client/api/src/cht.rs b/client/api/src/cht.rs index ecf52d0bab..55a38a5149 100644 --- a/client/api/src/cht.rs +++ b/client/api/src/cht.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Canonical hash trie definitions and helper functions. //! //! Each CHT is a trie mapping block numbers to canonical hash. diff --git a/client/api/src/in_mem.rs b/client/api/src/in_mem.rs index d5b4800f4e..07df822488 100644 --- a/client/api/src/in_mem.rs +++ b/client/api/src/in_mem.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! In memory client backend use std::collections::HashMap; diff --git a/client/api/src/leaves.rs b/client/api/src/leaves.rs index a555943444..e89aeed8d1 100644 --- a/client/api/src/leaves.rs +++ b/client/api/src/leaves.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Helper for managing the set of available leaves in the chain for DB implementations. use std::collections::BTreeMap; diff --git a/client/api/src/notifications.rs b/client/api/src/notifications.rs index 412fe8adc1..72071eb20c 100644 --- a/client/api/src/notifications.rs +++ b/client/api/src/notifications.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Storage notifications use std::{ diff --git a/client/api/src/proof_provider.rs b/client/api/src/proof_provider.rs index 93160855ea..66039b9601 100644 --- a/client/api/src/proof_provider.rs +++ b/client/api/src/proof_provider.rs @@ -1,18 +1,21 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . + //! Proof utilities use sp_runtime::{ generic::BlockId, diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 1a0c3d89af..d2b74b51e1 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate authority discovery." diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index c13bca894c..09c0319d29 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{iter::FromIterator, sync::{Arc, Mutex}}; use futures::channel::mpsc::channel; diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index a9ac58ef32..ad15cbedd3 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-basic-authorship" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Basic implementation of block-authoring logic." diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index e1e99938e3..2deecc72b9 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A consensus proposer for "basic" chains which use the primitive inherent-data. // FIXME #1021 move this into sp-consensus diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index 5eb60f1cd5..bebce17059 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Basic implementation of block-authoring logic. //! //! # Example diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index 15cc3c1393..df2aca9cf5 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-block-builder" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate block builder" diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index 2154a1f5f2..730fe0258e 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate block builder //! //! This crate provides the [`BlockBuilder`] utility and the corresponding runtime api diff --git a/client/chain-spec/Cargo.toml b/client/chain-spec/Cargo.toml index 6906b1ecda..fbbf05f55b 100644 --- a/client/chain-spec/Cargo.toml +++ b/client/chain-spec/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-chain-spec" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate chain configurations." diff --git a/client/chain-spec/derive/Cargo.toml b/client/chain-spec/derive/Cargo.toml index 66058b3f72..643b3bab82 100644 --- a/client/chain-spec/derive/Cargo.toml +++ b/client/chain-spec/derive/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-chain-spec-derive" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Macros to derive chain spec extension traits implementation." diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index 8e941161ee..333aa6fb5c 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate chain configurations. use std::{borrow::Cow, fs::File, path::PathBuf, sync::Arc, collections::HashMap}; diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 198a9df5b5..1dc5f1a39f 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/cli/src/arg_enums.rs b/client/cli/src/arg_enums.rs index c146a16886..3269a702fd 100644 --- a/client/cli/src/arg_enums.rs +++ b/client/cli/src/arg_enums.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . // NOTE: we allow missing docs here because arg_enum! creates the function variants without doc #![allow(missing_docs)] diff --git a/client/cli/src/commands/build_spec_cmd.rs b/client/cli/src/commands/build_spec_cmd.rs index a01101fa79..ca927adacd 100644 --- a/client/cli/src/commands/build_spec_cmd.rs +++ b/client/cli/src/commands/build_spec_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error; use crate::params::NodeKeyParams; use crate::params::SharedParams; diff --git a/client/cli/src/commands/check_block_cmd.rs b/client/cli/src/commands/check_block_cmd.rs index d5242cda85..7d5110a29c 100644 --- a/client/cli/src/commands/check_block_cmd.rs +++ b/client/cli/src/commands/check_block_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{ CliConfiguration, error, params::{ImportParams, SharedParams, BlockNumberOrHash}, }; diff --git a/client/cli/src/commands/export_blocks_cmd.rs b/client/cli/src/commands/export_blocks_cmd.rs index 4f7cf0f48c..b23f16d884 100644 --- a/client/cli/src/commands/export_blocks_cmd.rs +++ b/client/cli/src/commands/export_blocks_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error; use crate::params::{BlockNumber, DatabaseParams, PruningParams, SharedParams}; use crate::CliConfiguration; diff --git a/client/cli/src/commands/export_state_cmd.rs b/client/cli/src/commands/export_state_cmd.rs index db6f81c498..45b943ba3e 100644 --- a/client/cli/src/commands/export_state_cmd.rs +++ b/client/cli/src/commands/export_state_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{ CliConfiguration, error, params::{PruningParams, SharedParams, BlockNumberOrHash}, }; diff --git a/client/cli/src/commands/import_blocks_cmd.rs b/client/cli/src/commands/import_blocks_cmd.rs index ce95640f46..4690eb23f0 100644 --- a/client/cli/src/commands/import_blocks_cmd.rs +++ b/client/cli/src/commands/import_blocks_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error; use crate::params::ImportParams; use crate::params::SharedParams; diff --git a/client/cli/src/commands/mod.rs b/client/cli/src/commands/mod.rs index 54a6f9b743..c1fd9e0328 100644 --- a/client/cli/src/commands/mod.rs +++ b/client/cli/src/commands/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . mod build_spec_cmd; mod check_block_cmd; mod export_blocks_cmd; diff --git a/client/cli/src/commands/purge_chain_cmd.rs b/client/cli/src/commands/purge_chain_cmd.rs index b3fb0de247..9b77906e38 100644 --- a/client/cli/src/commands/purge_chain_cmd.rs +++ b/client/cli/src/commands/purge_chain_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error; use crate::params::{DatabaseParams, SharedParams}; use crate::CliConfiguration; diff --git a/client/cli/src/commands/revert_cmd.rs b/client/cli/src/commands/revert_cmd.rs index f7629ff2f6..03b16578b3 100644 --- a/client/cli/src/commands/revert_cmd.rs +++ b/client/cli/src/commands/revert_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error; use crate::params::{BlockNumber, PruningParams, SharedParams}; use crate::CliConfiguration; diff --git a/client/cli/src/commands/run_cmd.rs b/client/cli/src/commands/run_cmd.rs index f7cec61df1..ea8bd640a5 100644 --- a/client/cli/src/commands/run_cmd.rs +++ b/client/cli/src/commands/run_cmd.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::arg_enums::RpcMethods; use crate::error::{Error, Result}; use crate::params::ImportParams; diff --git a/client/cli/src/config.rs b/client/cli/src/config.rs index 56830f2076..d309c1e34a 100644 --- a/client/cli/src/config.rs +++ b/client/cli/src/config.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Configuration trait for a CLI based on substrate use crate::arg_enums::Database; diff --git a/client/cli/src/error.rs b/client/cli/src/error.rs index edc1adecc7..8839ff79c4 100644 --- a/client/cli/src/error.rs +++ b/client/cli/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Initialization errors. /// Result type alias for the CLI. diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index f9660af8a0..a9195ab383 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate CLI library. #![warn(missing_docs)] diff --git a/client/cli/src/params/database_params.rs b/client/cli/src/params/database_params.rs index dd0d1686e0..76e38e424d 100644 --- a/client/cli/src/params/database_params.rs +++ b/client/cli/src/params/database_params.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::arg_enums::Database; use structopt::StructOpt; diff --git a/client/cli/src/params/import_params.rs b/client/cli/src/params/import_params.rs index c5acc6bd81..5602f098d8 100644 --- a/client/cli/src/params/import_params.rs +++ b/client/cli/src/params/import_params.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::arg_enums::{ ExecutionStrategy, TracingReceiver, WasmExecutionMethod, DEFAULT_EXECUTION_BLOCK_CONSTRUCTION, DEFAULT_EXECUTION_IMPORT_BLOCK, diff --git a/client/cli/src/params/keystore_params.rs b/client/cli/src/params/keystore_params.rs index c6131c2f64..aa9ddeef49 100644 --- a/client/cli/src/params/keystore_params.rs +++ b/client/cli/src/params/keystore_params.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error::Result; use sc_service::config::KeystoreConfig; use std::fs; diff --git a/client/cli/src/params/mod.rs b/client/cli/src/params/mod.rs index da236ee165..152fe4c93c 100644 --- a/client/cli/src/params/mod.rs +++ b/client/cli/src/params/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . mod database_params; mod import_params; mod keystore_params; diff --git a/client/cli/src/params/network_params.rs b/client/cli/src/params/network_params.rs index 79112b041c..6f5aea15d3 100644 --- a/client/cli/src/params/network_params.rs +++ b/client/cli/src/params/network_params.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::params::node_key_params::NodeKeyParams; use sc_network::{ config::{NetworkConfiguration, NodeKeyConfig, NonReservedPeerMode, TransportConfig}, diff --git a/client/cli/src/params/node_key_params.rs b/client/cli/src/params/node_key_params.rs index 2913ff2c10..34d5d618fb 100644 --- a/client/cli/src/params/node_key_params.rs +++ b/client/cli/src/params/node_key_params.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use sc_network::config::NodeKeyConfig; use sp_core::H256; use std::{path::PathBuf, str::FromStr}; diff --git a/client/cli/src/params/offchain_worker_params.rs b/client/cli/src/params/offchain_worker_params.rs index eb3cc74ad9..87f6e23752 100644 --- a/client/cli/src/params/offchain_worker_params.rs +++ b/client/cli/src/params/offchain_worker_params.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Offchain worker related configuration parameters. //! diff --git a/client/cli/src/params/pruning_params.rs b/client/cli/src/params/pruning_params.rs index ed8f7ab168..aa86d939e6 100644 --- a/client/cli/src/params/pruning_params.rs +++ b/client/cli/src/params/pruning_params.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::error; use sc_service::{PruningMode, Role}; use structopt::StructOpt; diff --git a/client/cli/src/params/shared_params.rs b/client/cli/src/params/shared_params.rs index c8381cd069..d29bd104ad 100644 --- a/client/cli/src/params/shared_params.rs +++ b/client/cli/src/params/shared_params.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::path::PathBuf; use structopt::StructOpt; diff --git a/client/cli/src/params/transaction_pool_params.rs b/client/cli/src/params/transaction_pool_params.rs index dfcdf9af70..d5205b5c9f 100644 --- a/client/cli/src/params/transaction_pool_params.rs +++ b/client/cli/src/params/transaction_pool_params.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use sc_service::config::TransactionPoolOptions; use structopt::StructOpt; diff --git a/client/cli/src/runner.rs b/client/cli/src/runner.rs index 277d5f97b8..042e21e441 100644 --- a/client/cli/src/runner.rs +++ b/client/cli/src/runner.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::CliConfiguration; use crate::Result; use crate::SubstrateCli; diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index 82196feac0..bc0a6ace3f 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/consensus/aura/src/digests.rs b/client/consensus/aura/src/digests.rs index 8dd42fc01d..b415560e76 100644 --- a/client/consensus/aura/src/digests.rs +++ b/client/consensus/aura/src/digests.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Aura (Authority-Round) digests //! //! This implements the digests for AuRa, to allow the private diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index f61fdf4491..826758203c 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -1,18 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Aura (Authority-round) consensus in substrate. //! diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index ddae8f84b7..eed1d5d5da 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" documentation = "https://docs.rs/sc-consensus-babe" diff --git a/client/consensus/babe/rpc/Cargo.toml b/client/consensus/babe/rpc/Cargo.toml index 1856ff8baf..2a0762e1a8 100644 --- a/client/consensus/babe/rpc/Cargo.toml +++ b/client/consensus/babe/rpc/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "RPC extensions for the BABE consensus algorithm" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index 44273a2859..384a05353b 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! RPC api for babe. use sc_consensus_babe::{Epoch, authorship, Config}; diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index dae6f341d1..bf7fac9568 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-consensus" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Collection of common consensus specific imlementations for Substrate (client)" diff --git a/client/consensus/epochs/Cargo.toml b/client/consensus/epochs/Cargo.toml index de14b5c6be..7c2edffc53 100644 --- a/client/consensus/epochs/Cargo.toml +++ b/client/consensus/epochs/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Generic epochs-based utilities for consensus" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index b0a3c2bd72..5217b5b139 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Manual sealing engine for Substrate" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/consensus/manual-seal/src/error.rs b/client/consensus/manual-seal/src/error.rs index d6ee9f1767..343e50b291 100644 --- a/client/consensus/manual-seal/src/error.rs +++ b/client/consensus/manual-seal/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A manual sealing engine: the engine listens for rpc calls to seal blocks and create forks. //! This is suitable for a testing environment. use sp_consensus::{Error as ConsensusError, ImportResult}; diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index c59bd61a97..14eaada567 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A manual sealing engine: the engine listens for rpc calls to seal blocks and create forks. //! This is suitable for a testing environment. diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index 0c1cc9c12c..cb4f44479e 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "PoW consensus algorithm for substrate" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index 8d17071f4c..dc647448e0 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Proof of work consensus for Substrate. //! //! To use this engine, you can need to have a struct that implements diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index d39d538255..3ea7473029 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/consensus/uncles/Cargo.toml b/client/consensus/uncles/Cargo.toml index 019c933a20..b9039d8189 100644 --- a/client/consensus/uncles/Cargo.toml +++ b/client/consensus/uncles/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Generic uncle inclusion utilities for consensus" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index a6f97957c6..c9006ee2f6 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-client-db" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Client backend that uses RocksDB database as storage." diff --git a/client/db/src/bench.rs b/client/db/src/bench.rs index 9d6f595498..2d815bdeba 100644 --- a/client/db/src/bench.rs +++ b/client/db/src/bench.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! State backend that's useful for benchmarking use std::sync::Arc; diff --git a/client/db/src/cache/list_cache.rs b/client/db/src/cache/list_cache.rs index f3a8171342..c1d71cfb5d 100644 --- a/client/db/src/cache/list_cache.rs +++ b/client/db/src/cache/list_cache.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! List-based cache. //! //! Maintains several lists, containing nodes that are inserted whenever diff --git a/client/db/src/cache/list_entry.rs b/client/db/src/cache/list_entry.rs index e184343290..744cb226c8 100644 --- a/client/db/src/cache/list_entry.rs +++ b/client/db/src/cache/list_entry.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! List-cache storage entries. use sp_blockchain::Result as ClientResult; diff --git a/client/db/src/cache/list_storage.rs b/client/db/src/cache/list_storage.rs index 07cd9fb866..21917e6eb9 100644 --- a/client/db/src/cache/list_storage.rs +++ b/client/db/src/cache/list_storage.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! List-cache storage definition and implementation. use std::sync::Arc; diff --git a/client/db/src/cache/mod.rs b/client/db/src/cache/mod.rs index f2d357ca9e..a6cb93c6ce 100644 --- a/client/db/src/cache/mod.rs +++ b/client/db/src/cache/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! DB-backed cache of blockchain data. use std::{sync::Arc, collections::{HashMap, hash_map::Entry}}; diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index d1eb10ea31..cbc637cf84 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Client backend that is backed by a database. //! //! # Canonicality vs. Finality diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 849b439424..56c06ff406 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! RocksDB-based light client blockchain storage. use std::{sync::Arc, collections::HashMap}; diff --git a/client/db/src/offchain.rs b/client/db/src/offchain.rs index 8c58d5f42c..8cd94a1594 100644 --- a/client/db/src/offchain.rs +++ b/client/db/src/offchain.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! RocksDB-based offchain workers local storage. use std::{ diff --git a/client/db/src/parity_db.rs b/client/db/src/parity_db.rs index 7333f70e25..1c8280e730 100644 --- a/client/db/src/parity_db.rs +++ b/client/db/src/parity_db.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . /// A `Database` adapter for parity-db. use sp_database::{Database, Change, Transaction, ColumnId}; diff --git a/client/db/src/stats.rs b/client/db/src/stats.rs index 8bc93b5b64..cb9c64c850 100644 --- a/client/db/src/stats.rs +++ b/client/db/src/stats.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Database usage statistics use std::sync::atomic::{AtomicU64, Ordering as AtomicOrdering}; diff --git a/client/db/src/subdb.rs b/client/db/src/subdb.rs index 2e436aa2c9..683c33dedd 100644 --- a/client/db/src/subdb.rs +++ b/client/db/src/subdb.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . /// A `Database` adapter for subdb. use sp_database::{self, ColumnId}; diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index b52126536f..64734ff7d2 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Db-based backend utility structures and functions, used by both //! full and light storages. diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index ef1b24ea71..ac863fbd8c 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-executor" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "A crate that provides means of executing/dispatching calls into the runtime." diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index c27ed8db0a..ed91c353b9 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-executor-common" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "A set of common definitions that are needed for defining execution engines." diff --git a/client/executor/common/src/error.rs b/client/executor/common/src/error.rs index 66d520e942..e2f482f233 100644 --- a/client/executor/common/src/error.rs +++ b/client/executor/common/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Rust executor possible errors. use sp_serializer; diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index ccfdc2f3e0..3500bf8575 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! This module implements sandboxing support in the runtime. //! //! Sandboxing is baked by wasmi at the moment. In future, however, we would like to add/switch to diff --git a/client/executor/common/src/util.rs b/client/executor/common/src/util.rs index 149db13bc0..4734e8d6fd 100644 --- a/client/executor/common/src/util.rs +++ b/client/executor/common/src/util.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A set of utilities for resetting a wasm instance to its initial state. use crate::error::{self, Error}; diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index b8ae805192..c675e72e0f 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" publish = false homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 886860d7fe..7ec0d22c6d 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . mod sandbox; use codec::{Encode, Decode}; diff --git a/client/executor/src/integration_tests/sandbox.rs b/client/executor/src/integration_tests/sandbox.rs index 8e8b7896cf..35ece0a701 100644 --- a/client/executor/src/integration_tests/sandbox.rs +++ b/client/executor/src/integration_tests/sandbox.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::{TestExternalities, call_in_wasm}; use crate::WasmExecutionMethod; diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index 3d7db630f0..2630282b80 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A crate that provides means of executing/dispatching calls into the runtime. //! //! There are a few responsibilities of this crate at the moment: diff --git a/client/executor/src/native_executor.rs b/client/executor/src/native_executor.rs index b859b544a3..61014bab3c 100644 --- a/client/executor/src/native_executor.rs +++ b/client/executor/src/native_executor.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{ RuntimeInfo, error::{Error, Result}, wasm_runtime::{RuntimeCache, WasmExecutionMethod}, diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 3180eebb4f..7ccb167325 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-executor-wasmi" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "This crate provides an implementation of `WasmRuntime` that is baked by wasmi." diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 0864c19bf0..8a424dfc2e 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-executor-wasmtime" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Defines a `WasmRuntime` that uses the Wasmtime JIT to execute." diff --git a/client/executor/wasmtime/src/imports.rs b/client/executor/wasmtime/src/imports.rs index 2d9794b7ed..1fc570c200 100644 --- a/client/executor/wasmtime/src/imports.rs +++ b/client/executor/wasmtime/src/imports.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::state_holder; use sc_executor_common::error::WasmError; use sp_wasm_interface::{Function, Value, ValueType}; diff --git a/client/executor/wasmtime/src/instance_wrapper.rs b/client/executor/wasmtime/src/instance_wrapper.rs index bf01896809..006eb5eb20 100644 --- a/client/executor/wasmtime/src/instance_wrapper.rs +++ b/client/executor/wasmtime/src/instance_wrapper.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Defines data and logic needed for interaction with an WebAssembly instance of a substrate //! runtime module. diff --git a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs index 602c780f72..8dceca70a6 100644 --- a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs +++ b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::InstanceWrapper; use sc_executor_common::{ error::{Error, Result}, diff --git a/client/executor/wasmtime/src/state_holder.rs b/client/executor/wasmtime/src/state_holder.rs index 42cb79e7a3..e44bfad122 100644 --- a/client/executor/wasmtime/src/state_holder.rs +++ b/client/executor/wasmtime/src/state_holder.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::host::{HostContext, HostState}; scoped_tls::scoped_thread_local!(static HOST_STATE: HostState); diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 675e571c65..f0f89b6278 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-finality-grandpa" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Integration of the GRANDPA finality gadget into substrate." diff --git a/client/finality-grandpa/rpc/Cargo.toml b/client/finality-grandpa/rpc/Cargo.toml index 9435b6142b..0eecec19f7 100644 --- a/client/finality-grandpa/rpc/Cargo.toml +++ b/client/finality-grandpa/rpc/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Parity Technologies "] description = "RPC extensions for the GRANDPA finality gadget" repository = "https://github.com/paritytech/substrate/" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] sc-finality-grandpa = { version = "0.8.0-dev", path = "../" } diff --git a/client/finality-grandpa/rpc/src/error.rs b/client/finality-grandpa/rpc/src/error.rs index c4a3877f51..eab319d3a7 100644 --- a/client/finality-grandpa/rpc/src/error.rs +++ b/client/finality-grandpa/rpc/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::NOT_READY_ERROR_CODE; #[derive(derive_more::Display, derive_more::From)] diff --git a/client/finality-grandpa/rpc/src/lib.rs b/client/finality-grandpa/rpc/src/lib.rs index e62bcf85b6..c146aaf10c 100644 --- a/client/finality-grandpa/rpc/src/lib.rs +++ b/client/finality-grandpa/rpc/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! RPC API for GRANDPA. #![warn(missing_docs)] diff --git a/client/finality-grandpa/rpc/src/report.rs b/client/finality-grandpa/rpc/src/report.rs index 029fd4b46d..d8667f5609 100644 --- a/client/finality-grandpa/rpc/src/report.rs +++ b/client/finality-grandpa/rpc/src/report.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{ collections::{BTreeSet, HashSet}, fmt::Debug, diff --git a/client/finality-grandpa/src/authorities.rs b/client/finality-grandpa/src/authorities.rs index 12cb1456d3..a897ac0209 100644 --- a/client/finality-grandpa/src/authorities.rs +++ b/client/finality-grandpa/src/authorities.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Utilities for dealing with authorities, authority sets, and handoffs. use fork_tree::ForkTree; diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index d50968a468..1bef06572b 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Communication streams for the polite-grandpa networking protocol. //! //! GRANDPA nodes communicate over a gossip network, where messages are not sent to diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index 34a2358159..b8996df9d4 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::collections::BTreeMap; use std::iter::FromIterator; use std::pin::Pin; diff --git a/client/finality-grandpa/src/finality_proof.rs b/client/finality-grandpa/src/finality_proof.rs index 867d2b27ab..d50418128b 100644 --- a/client/finality-grandpa/src/finality_proof.rs +++ b/client/finality-grandpa/src/finality_proof.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! GRANDPA block finality proof generation and check. //! //! Finality of block B is proved by providing: diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index 4960b23dc5..7118492492 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{sync::Arc, collections::HashMap}; use log::{debug, trace}; diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index 98bc859b5f..595435e4e3 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::collections::{HashMap, HashSet}; use std::sync::Arc; diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index c499912043..3cd5c5791e 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Integration of the GRANDPA finality gadget into substrate. //! //! This crate is unstable and the API and usage may change. diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index e00bfec44c..cab2b894ec 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index 64e5b0545b..dd746edb42 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Tests and test helpers for GRANDPA. use super::*; diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index 90f99519a7..ab182004a9 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Helper stream for waiting until one or more blocks are imported before //! passing through inner items. This is done in a generic way to support //! many different kinds of items. diff --git a/client/finality-grandpa/src/voting_rule.rs b/client/finality-grandpa/src/voting_rule.rs index bcf17039a8..9e234328a3 100644 --- a/client/finality-grandpa/src/voting_rule.rs +++ b/client/finality-grandpa/src/voting_rule.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Handling custom voting rules for GRANDPA. //! //! This exposes the `VotingRule` trait used to implement arbitrary voting diff --git a/client/informant/Cargo.toml b/client/informant/Cargo.toml index f8e6ca85f9..5957cfc297 100644 --- a/client/informant/Cargo.toml +++ b/client/informant/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate informant." edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/informant/src/lib.rs b/client/informant/src/lib.rs index 090282a982..3f4724824d 100644 --- a/client/informant/src/lib.rs +++ b/client/informant/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Console informant. Prints sync progress and block events. Runs on the calling thread. use ansi_term::Colour; diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index f3419f55e1..6de93f28be 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-keystore" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Keystore (and session key management) for ed25519 based chains like Polkadot." diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 4b02a6f70e..d46e3420ea 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -2,7 +2,7 @@ description = "Gossiping for the Substrate network protocol" name = "sc-network-gossip" version = "0.8.0-dev" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/client/network-gossip/src/state_machine.rs b/client/network-gossip/src/state_machine.rs index 433457afe7..693e14f813 100644 --- a/client/network-gossip/src/state_machine.rs +++ b/client/network-gossip/src/state_machine.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{Network, MessageIntent, Validator, ValidatorContext, ValidationResult}; use std::collections::{HashMap, HashSet}; diff --git a/client/network-gossip/src/validator.rs b/client/network-gossip/src/validator.rs index 6b330d7b61..2fb9282c48 100644 --- a/client/network-gossip/src/validator.rs +++ b/client/network-gossip/src/validator.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use sc_network::{ObservedRole, PeerId}; use sp_runtime::traits::Block as BlockT; diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index e31e0f3113..537ab43672 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -2,7 +2,7 @@ description = "Substrate network protocol" name = "sc-network" version = "0.8.0-dev" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/client/network/src/chain.rs b/client/network/src/chain.rs index 4e7e28be93..e3deda0dc9 100644 --- a/client/network/src/chain.rs +++ b/client/network/src/chain.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Blockchain access trait use sp_blockchain::{Error, HeaderBackend, HeaderMetadata}; diff --git a/client/network/src/config.rs b/client/network/src/config.rs index 9a979ac16d..f03b2169e9 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Configuration of the networking layer. //! //! The [`Params`] struct is the struct that must be passed in order to initialize the networking. diff --git a/client/network/src/error.rs b/client/network/src/error.rs index 158e75fcf1..270c0e7b8d 100644 --- a/client/network/src/error.rs +++ b/client/network/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate network possible errors. use libp2p::{PeerId, Multiaddr}; diff --git a/client/network/src/lib.rs b/client/network/src/lib.rs index dbc54d21c4..8174666ab7 100644 --- a/client/network/src/lib.rs +++ b/client/network/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . #![warn(unused_extern_crates)] #![warn(missing_docs)] diff --git a/client/network/src/network_state.rs b/client/network/src/network_state.rs index 00d53976ae..d8920951bc 100644 --- a/client/network/src/network_state.rs +++ b/client/network/src/network_state.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Information about the networking, for diagnostic purposes. //! //! **Warning**: These APIs are not stable. diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index c8bd7f2867..c4d52db351 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! On-demand requests service. use crate::light_client_handler; diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index c2f5fce8bf..e9f7b3eeed 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{ ExHashT, chain::{Client, FinalityProofProvider}, diff --git a/client/network/src/protocol/generic_proto/handler.rs b/client/network/src/protocol/generic_proto/handler.rs index f0e2fc4bb8..a013b933c2 100644 --- a/client/network/src/protocol/generic_proto/handler.rs +++ b/client/network/src/protocol/generic_proto/handler.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . pub use self::group::{NotifsHandlerProto, NotifsHandler, NotifsHandlerIn, NotifsHandlerOut}; pub use self::legacy::ConnectionKillError as LegacyConnectionKillError; diff --git a/client/network/src/protocol/generic_proto/handler/notif_in.rs b/client/network/src/protocol/generic_proto/handler/notif_in.rs index 83923154bd..a979b8f9cd 100644 --- a/client/network/src/protocol/generic_proto/handler/notif_in.rs +++ b/client/network/src/protocol/generic_proto/handler/notif_in.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Implementations of the `IntoProtocolsHandler` and `ProtocolsHandler` traits for ingoing //! substreams for a single gossiping protocol. //! diff --git a/client/network/src/protocol/generic_proto/upgrade.rs b/client/network/src/protocol/generic_proto/upgrade.rs index 36f8263365..7172451cee 100644 --- a/client/network/src/protocol/generic_proto/upgrade.rs +++ b/client/network/src/protocol/generic_proto/upgrade.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . pub use self::collec::UpgradeCollec; pub use self::legacy::{ RegisteredProtocol, diff --git a/client/network/src/protocol/generic_proto/upgrade/legacy.rs b/client/network/src/protocol/generic_proto/upgrade/legacy.rs index 311e0b04f9..15e34197d4 100644 --- a/client/network/src/protocol/generic_proto/upgrade/legacy.rs +++ b/client/network/src/protocol/generic_proto/upgrade/legacy.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::config::ProtocolId; use bytes::BytesMut; use futures::prelude::*; diff --git a/client/network/src/protocol/message.rs b/client/network/src/protocol/message.rs index 8638e9afc5..155e945f4e 100644 --- a/client/network/src/protocol/message.rs +++ b/client/network/src/protocol/message.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Network packet message types. These get serialized and put into the lower level protocol payload. use bitflags::bitflags; diff --git a/client/network/src/protocol/sync/blocks.rs b/client/network/src/protocol/sync/blocks.rs index 359287701e..e59f22509c 100644 --- a/client/network/src/protocol/sync/blocks.rs +++ b/client/network/src/protocol/sync/blocks.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::cmp; use std::ops::Range; use std::collections::{HashMap, BTreeMap}; diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index 3d854b574b..09fcdcf491 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use sp_blockchain::Error as ClientError; use crate::protocol::sync::{PeerSync, PeerSyncState}; use fork_tree::ForkTree; diff --git a/client/network/src/schema.rs b/client/network/src/schema.rs index 0c8a650e69..dbc85dd97b 100644 --- a/client/network/src/schema.rs +++ b/client/network/src/schema.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Include sources generated from protobuf definitions. pub mod v1 { diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 64b3d3b5b2..f80801b1cc 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Main entry point of the sc-network crate. //! //! There are two main structs in this module: [`NetworkWorker`] and [`NetworkService`]. diff --git a/client/network/src/service/out_events.rs b/client/network/src/service/out_events.rs index 2d4d7ded21..08c0968cf9 100644 --- a/client/network/src/service/out_events.rs +++ b/client/network/src/service/out_events.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Registering events streams. //! //! This code holds the logic that is used for the network service to inform other parts of diff --git a/client/network/src/service/tests.rs b/client/network/src/service/tests.rs index 3bed660851..4347f80d2b 100644 --- a/client/network/src/service/tests.rs +++ b/client/network/src/service/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{config, Event, NetworkService, NetworkWorker}; use futures::prelude::*; diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 75ee2d5db8..5dca5ff43b 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 154694c692..5abc9a1ea7 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -2,7 +2,7 @@ description = "Integration tests for Substrate network protocol" name = "sc-network-test" version = "0.8.0-dev" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" publish = false diff --git a/client/network/test/src/block_import.rs b/client/network/test/src/block_import.rs index a77dec629b..6bc2b9dbad 100644 --- a/client/network/test/src/block_import.rs +++ b/client/network/test/src/block_import.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Testing block import logic. use sp_consensus::ImportedAux; diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 999c99f64a..cdcdf37ccf 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . #![allow(missing_docs)] #[cfg(test)] diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index 60e9e558c5..50051540d2 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use sp_consensus::BlockOrigin; use std::time::Duration; use futures::executor::block_on; diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index ac3a71ad0d..5a13b44a80 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -2,7 +2,7 @@ description = "Substrate offchain workers" name = "sc-offchain" version = "2.0.0-dev" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index d5aa08f2f4..b4c5005324 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Connectivity manager based on reputation" homepage = "http://parity.io" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" name = "sc-peerset" version = "2.0.0-dev" authors = ["Parity Technologies "] diff --git a/client/peerset/src/lib.rs b/client/peerset/src/lib.rs index 9376e9594b..6a6f3d0905 100644 --- a/client/peerset/src/lib.rs +++ b/client/peerset/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Peer Set Manager (PSM). Contains the strategy for choosing which nodes the network should be //! connected to. diff --git a/client/peerset/tests/fuzz.rs b/client/peerset/tests/fuzz.rs index 44477cec65..12e20a04be 100644 --- a/client/peerset/tests/fuzz.rs +++ b/client/peerset/tests/fuzz.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use futures::prelude::*; use libp2p::PeerId; use rand::distributions::{Distribution, Uniform, WeightedIndex}; diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index e0dac773bf..f591a6d853 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-rpc-api" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate RPC interfaces." diff --git a/client/rpc-api/src/author/error.rs b/client/rpc-api/src/author/error.rs index dfd488e5da..0b7d02a914 100644 --- a/client/rpc-api/src/author/error.rs +++ b/client/rpc-api/src/author/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Authoring RPC module errors. use crate::errors; diff --git a/client/rpc-api/src/author/mod.rs b/client/rpc-api/src/author/mod.rs index 49c4c996fa..aa3ec9bf5c 100644 --- a/client/rpc-api/src/author/mod.rs +++ b/client/rpc-api/src/author/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate block-author/full-node API. pub mod error; diff --git a/client/rpc-api/src/chain/error.rs b/client/rpc-api/src/chain/error.rs index ffa4d82bdf..6b3dd6341a 100644 --- a/client/rpc-api/src/chain/error.rs +++ b/client/rpc-api/src/chain/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Error helpers for Chain RPC module. diff --git a/client/rpc-api/src/chain/mod.rs b/client/rpc-api/src/chain/mod.rs index 2ab3851d37..13afa3ffc6 100644 --- a/client/rpc-api/src/chain/mod.rs +++ b/client/rpc-api/src/chain/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate blockchain API. pub mod error; diff --git a/client/rpc-api/src/child_state/mod.rs b/client/rpc-api/src/child_state/mod.rs index a46269cad6..8d0d0049af 100644 --- a/client/rpc-api/src/child_state/mod.rs +++ b/client/rpc-api/src/child_state/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate state API. use jsonrpc_derive::rpc; diff --git a/client/rpc-api/src/errors.rs b/client/rpc-api/src/errors.rs index b75c34ead3..96bbadc27d 100644 --- a/client/rpc-api/src/errors.rs +++ b/client/rpc-api/src/errors.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use log::warn; pub fn internal(e: E) -> jsonrpc_core::Error { diff --git a/client/rpc-api/src/helpers.rs b/client/rpc-api/src/helpers.rs index 912a5664b3..5eaa8d8d8f 100644 --- a/client/rpc-api/src/helpers.rs +++ b/client/rpc-api/src/helpers.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use jsonrpc_core::futures::prelude::*; use futures::{channel::oneshot, compat::Compat}; diff --git a/client/rpc-api/src/offchain/error.rs b/client/rpc-api/src/offchain/error.rs index 695c0cf41f..bfdd663121 100644 --- a/client/rpc-api/src/offchain/error.rs +++ b/client/rpc-api/src/offchain/error.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Offchain RPC errors. use jsonrpc_core as rpc; diff --git a/client/rpc-api/src/offchain/mod.rs b/client/rpc-api/src/offchain/mod.rs index bbe466ff59..9c60cf65b2 100644 --- a/client/rpc-api/src/offchain/mod.rs +++ b/client/rpc-api/src/offchain/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate offchain API. pub mod error; diff --git a/client/rpc-api/src/policy.rs b/client/rpc-api/src/policy.rs index c01b5232f3..74c2d0594b 100644 --- a/client/rpc-api/src/policy.rs +++ b/client/rpc-api/src/policy.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Policy-related types. //! //! Contains a `DenyUnsafe` type that can be used to deny potentially unsafe diff --git a/client/rpc-api/src/state/error.rs b/client/rpc-api/src/state/error.rs index c9c2cf4e45..a33bbd3df4 100644 --- a/client/rpc-api/src/state/error.rs +++ b/client/rpc-api/src/state/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! State RPC errors. use crate::errors; diff --git a/client/rpc-api/src/state/helpers.rs b/client/rpc-api/src/state/helpers.rs index 516b6c80c4..af414a0498 100644 --- a/client/rpc-api/src/state/helpers.rs +++ b/client/rpc-api/src/state/helpers.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate state API helpers. use sp_core::Bytes; diff --git a/client/rpc-api/src/state/mod.rs b/client/rpc-api/src/state/mod.rs index 3d38a16eb4..a31ef598c8 100644 --- a/client/rpc-api/src/state/mod.rs +++ b/client/rpc-api/src/state/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate state API. pub mod error; diff --git a/client/rpc-api/src/subscriptions.rs b/client/rpc-api/src/subscriptions.rs index 54881bad51..db5d178450 100644 --- a/client/rpc-api/src/subscriptions.rs +++ b/client/rpc-api/src/subscriptions.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::collections::HashMap; use std::sync::{Arc, atomic::{self, AtomicUsize}}; diff --git a/client/rpc-api/src/system/error.rs b/client/rpc-api/src/system/error.rs index fbb4e44bcb..a4b7a1ca54 100644 --- a/client/rpc-api/src/system/error.rs +++ b/client/rpc-api/src/system/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! System RPC module errors. use crate::system::helpers::Health; diff --git a/client/rpc-api/src/system/helpers.rs b/client/rpc-api/src/system/helpers.rs index 46461d6988..0b29011f21 100644 --- a/client/rpc-api/src/system/helpers.rs +++ b/client/rpc-api/src/system/helpers.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate system API helpers. use std::fmt; diff --git a/client/rpc-api/src/system/mod.rs b/client/rpc-api/src/system/mod.rs index 486623477e..769a914ecb 100644 --- a/client/rpc-api/src/system/mod.rs +++ b/client/rpc-api/src/system/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate system API. pub mod error; diff --git a/client/rpc-servers/Cargo.toml b/client/rpc-servers/Cargo.toml index 345aff13d8..a57baf1db7 100644 --- a/client/rpc-servers/Cargo.toml +++ b/client/rpc-servers/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-rpc-server" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate RPC servers." diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 97fb10c15e..cd1b33ad8b 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate RPC servers. #![warn(missing_docs)] diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 11ec1dbc9f..94d4b38600 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-rpc" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate Client RPC" diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index 23aed953d0..297fe2794b 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate block-author/full-node API. #[cfg(test)] diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index d0472abb9b..2f944afc8f 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::*; use std::{mem, sync::Arc}; diff --git a/client/rpc/src/chain/mod.rs b/client/rpc/src/chain/mod.rs index bd2e41bd4b..23e43e57fb 100644 --- a/client/rpc/src/chain/mod.rs +++ b/client/rpc/src/chain/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate blockchain API. mod chain_full; diff --git a/client/rpc/src/chain/tests.rs b/client/rpc/src/chain/tests.rs index b2e6e112a9..3c8ee5c817 100644 --- a/client/rpc/src/chain/tests.rs +++ b/client/rpc/src/chain/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::*; use assert_matches::assert_matches; use substrate_test_runtime_client::{ diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index 8d2dd16782..defb7257a5 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate RPC implementation. //! //! A core implementation of Substrate RPC interfaces. diff --git a/client/rpc/src/metadata.rs b/client/rpc/src/metadata.rs index d35653f8e6..cf795197f5 100644 --- a/client/rpc/src/metadata.rs +++ b/client/rpc/src/metadata.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! RPC Metadata use std::sync::Arc; diff --git a/client/rpc/src/offchain/mod.rs b/client/rpc/src/offchain/mod.rs index 16c03395c7..4ec11bfeb5 100644 --- a/client/rpc/src/offchain/mod.rs +++ b/client/rpc/src/offchain/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate offchain API. #[cfg(test)] diff --git a/client/rpc/src/offchain/tests.rs b/client/rpc/src/offchain/tests.rs index cb05f3d4db..8fa23715f7 100644 --- a/client/rpc/src/offchain/tests.rs +++ b/client/rpc/src/offchain/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::*; use assert_matches::assert_matches; use sp_core::{Bytes, offchain::storage::InMemOffchainStorage}; diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index d1f4e2c5f9..395da68a10 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate state API. mod state_full; diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index f0ac7b2e0f..85a12e11f9 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::*; use super::state_full::split_range; use self::error::Error; diff --git a/client/rpc/src/system/mod.rs b/client/rpc/src/system/mod.rs index 2a19e5412e..b73a924c41 100644 --- a/client/rpc/src/system/mod.rs +++ b/client/rpc/src/system/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate system API. #[cfg(test)] diff --git a/client/rpc/src/system/tests.rs b/client/rpc/src/system/tests.rs index d0ec695126..826e85f277 100644 --- a/client/rpc/src/system/tests.rs +++ b/client/rpc/src/system/tests.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use super::*; use sc_network::{self, PeerId}; diff --git a/client/rpc/src/testing.rs b/client/rpc/src/testing.rs index fecef568a9..48f9f90b9d 100644 --- a/client/rpc/src/testing.rs +++ b/client/rpc/src/testing.rs @@ -1,18 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Testing utils used by the RPC tests. diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index e5f6e229c7..5a026e5890 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-service" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate service. Starts a thread that spins up the network, client, and extrinsic pool. Manages communication between them." diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index b172681094..413fe709f7 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::{Service, NetworkStatus, NetworkState, error::Error, DEFAULT_PROTOCOL_ID, MallocSizeOfWasm}; use crate::{start_rpc_servers, build_network_future, TransactionPoolAdapter, TaskManager, SpawnTaskHandle}; use crate::status_sinks; diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 612e9310d1..7206ab6b3a 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Chain utilities. use crate::error; diff --git a/client/service/src/client/block_rules.rs b/client/service/src/client/block_rules.rs index e561451181..8ea9c42483 100644 --- a/client/service/src/client/block_rules.rs +++ b/client/service/src/client/block_rules.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Client fixed chain specification rules use std::collections::{HashMap, HashSet}; diff --git a/client/service/src/client/call_executor.rs b/client/service/src/client/call_executor.rs index 229e7478e9..093d74e3b3 100644 --- a/client/service/src/client/call_executor.rs +++ b/client/service/src/client/call_executor.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{sync::Arc, panic::UnwindSafe, result, cell::RefCell}; use codec::{Encode, Decode}; use sp_runtime::{ diff --git a/client/service/src/client/client.rs b/client/service/src/client/client.rs index df64622d64..09b9929a32 100644 --- a/client/service/src/client/client.rs +++ b/client/service/src/client/client.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate Client use std::{ diff --git a/client/service/src/client/genesis.rs b/client/service/src/client/genesis.rs index 41dbccc517..66436ce81f 100644 --- a/client/service/src/client/genesis.rs +++ b/client/service/src/client/genesis.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Tool for creating the genesis block. use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, Zero}; diff --git a/client/service/src/client/light/backend.rs b/client/service/src/client/light/backend.rs index 78f3938aaa..7ba60567ab 100644 --- a/client/service/src/client/light/backend.rs +++ b/client/service/src/client/light/backend.rs @@ -1,18 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . //! Light client backend. Only stores headers and justifications of blocks. //! Everything else is requested from full nodes on demand. diff --git a/client/service/src/client/light/blockchain.rs b/client/service/src/client/light/blockchain.rs index b6ccb4744b..02212a0263 100644 --- a/client/service/src/client/light/blockchain.rs +++ b/client/service/src/client/light/blockchain.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Light client blockchain backend. Only stores headers and justifications of recent //! blocks. CHT roots are stored for headers of ancient blocks. diff --git a/client/service/src/client/light/call_executor.rs b/client/service/src/client/light/call_executor.rs index 54fcf8e8f7..76551f2bfd 100644 --- a/client/service/src/client/light/call_executor.rs +++ b/client/service/src/client/light/call_executor.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Methods that light client could use to execute runtime calls. use std::{ diff --git a/client/service/src/client/light/fetcher.rs b/client/service/src/client/light/fetcher.rs index ae64565a50..e3b82bd2b2 100644 --- a/client/service/src/client/light/fetcher.rs +++ b/client/service/src/client/light/fetcher.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Light client data fetcher. Fetches requested data from remote full nodes. use std::sync::Arc; diff --git a/client/service/src/client/light/mod.rs b/client/service/src/client/light/mod.rs index 9b3c3f5b29..7cc13cfb6b 100644 --- a/client/service/src/client/light/mod.rs +++ b/client/service/src/client/light/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Light client components. pub mod backend; diff --git a/client/service/src/client/mod.rs b/client/service/src/client/mod.rs index fe3ad992b6..996b885fe5 100644 --- a/client/service/src/client/mod.rs +++ b/client/service/src/client/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate Client and associated logic. //! //! The [`Client`] is one of the most important components of Substrate. It mainly comprises two diff --git a/client/service/src/config.rs b/client/service/src/config.rs index e0de85b56d..0cc43dac48 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Service configuration. pub use sc_client_db::{Database, PruningMode, DatabaseSettingsSrc as DatabaseConfig}; diff --git a/client/service/src/error.rs b/client/service/src/error.rs index 5a78a18789..0b2bbd8d56 100644 --- a/client/service/src/error.rs +++ b/client/service/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Errors that can occur during the service operation. use sc_network; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index ad42a2b39f..ebd2b99ef1 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate service. Starts a thread that spins up the network, client, and extrinsic pool. //! Manages communication between them. diff --git a/client/service/src/metrics.rs b/client/service/src/metrics.rs index 6456f9b1ee..d1dd1a3bab 100644 --- a/client/service/src/metrics.rs +++ b/client/service/src/metrics.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::convert::TryFrom; use crate::NetworkStatus; diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index 094f6bcff0..c44f436513 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-service-test" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" publish = false homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/client/service/test/src/client/db.rs b/client/service/test/src/client/db.rs index bc175652c9..134075a11d 100644 --- a/client/service/test/src/client/db.rs +++ b/client/service/test/src/client/db.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use sp_core::offchain::{OffchainStorage, storage::InMemOffchainStorage}; use std::sync::Arc; diff --git a/client/service/test/src/client/light.rs b/client/service/test/src/client/light.rs index 76e48828ee..0ad5ba78fb 100644 --- a/client/service/test/src/client/light.rs +++ b/client/service/test/src/client/light.rs @@ -1,18 +1,21 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// along with this program. If not, see . + use sc_service::client::light::{ call_executor::{ GenesisCallExecutor, diff --git a/client/service/test/src/client/mod.rs b/client/service/test/src/client/mod.rs index e81d1ebb53..0791c421bd 100644 --- a/client/service/test/src/client/mod.rs +++ b/client/service/test/src/client/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use parity_scale_codec::{Encode, Decode, Joiner}; use sc_executor::native_executor_instance; use sp_state_machine::{StateMachine, OverlayedChanges, ExecutionStrategy, InMemoryBackend}; diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index fd67741365..faffce3e0a 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Service integration test utils. use std::iter; diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index c2d2f2eb0b..f4f084bc89 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-state-db" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "State database maintenance. Handles canonicalization and pruning in the database." diff --git a/client/state-db/src/lib.rs b/client/state-db/src/lib.rs index 94d51c8912..6025501102 100644 --- a/client/state-db/src/lib.rs +++ b/client/state-db/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! State database maintenance. Handles canonicalization and pruning in the database. The input to //! this module is a `ChangeSet` which is basically a list of key-value pairs (trie nodes) that //! were added or deleted during block execution. diff --git a/client/state-db/src/noncanonical.rs b/client/state-db/src/noncanonical.rs index 6a743e7d45..e9b4c829e1 100644 --- a/client/state-db/src/noncanonical.rs +++ b/client/state-db/src/noncanonical.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Canonicalization window. //! Maintains trees of block overlays and allows discarding trees/roots //! The overlays are added in `insert` and removed in `canonicalize`. diff --git a/client/state-db/src/pruning.rs b/client/state-db/src/pruning.rs index 6921beea91..3ab4a61da4 100644 --- a/client/state-db/src/pruning.rs +++ b/client/state-db/src/pruning.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Pruning window. //! //! For each block we maintain a list of nodes pending deletion. diff --git a/client/state-db/src/test.rs b/client/state-db/src/test.rs index accafa9bf8..d445ce6b6d 100644 --- a/client/state-db/src/test.rs +++ b/client/state-db/src/test.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Test utils use std::collections::HashMap; diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 0928d1d2a1..e2c08babf3 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" documentation = "https://docs.rs/sc-telemetry" diff --git a/client/telemetry/src/lib.rs b/client/telemetry/src/lib.rs index 6c90d6bbcc..b959697f39 100644 --- a/client/telemetry/src/lib.rs +++ b/client/telemetry/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Telemetry utilities. //! //! Calling `init_telemetry` registers a global `slog` logger using `slog_scope::set_global_logger`. diff --git a/client/telemetry/src/worker.rs b/client/telemetry/src/worker.rs index 8f43bb612a..04689f7686 100644 --- a/client/telemetry/src/worker.rs +++ b/client/telemetry/src/worker.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Contains the object that makes the telemetry work. //! //! # Usage diff --git a/client/telemetry/src/worker/node.rs b/client/telemetry/src/worker/node.rs index 454f504d66..0662ecab54 100644 --- a/client/telemetry/src/worker/node.rs +++ b/client/telemetry/src/worker/node.rs @@ -1,19 +1,20 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Contains the `Node` struct, which handles communications with a single telemetry endpoint. use bytes::BytesMut; diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 23f44fd057..52fa8d6600 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "sc-tracing" version = "2.0.0-dev" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 6d4f69676c..8b51bc7418 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-transaction-pool" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate transaction pool implementation." diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index 842d54f920..4f9131aa96 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -3,7 +3,7 @@ name = "sc-transaction-graph" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Generic Transaction Pool" diff --git a/client/transaction-pool/graph/benches/basics.rs b/client/transaction-pool/graph/benches/basics.rs index 23b4dba348..544d31e176 100644 --- a/client/transaction-pool/graph/benches/basics.rs +++ b/client/transaction-pool/graph/benches/basics.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use criterion::{criterion_group, criterion_main, Criterion}; use futures::{future::{ready, Ready}, executor::block_on}; diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 38151e9bfd..452f9c9feb 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! A basic version of the dependency graph. //! //! For a more full-featured pool, have a look at the `pool` module. diff --git a/client/transaction-pool/graph/src/error.rs b/client/transaction-pool/graph/src/error.rs index 6fd7748e36..c04f90dac0 100644 --- a/client/transaction-pool/graph/src/error.rs +++ b/client/transaction-pool/graph/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Transaction pool errors. use sp_runtime::transaction_validity::{ diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index 76181c837f..beff5bb2cc 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{ collections::{HashMap, HashSet}, fmt, diff --git a/client/transaction-pool/graph/src/lib.rs b/client/transaction-pool/graph/src/lib.rs index ed10ef38d2..632f7d3feb 100644 --- a/client/transaction-pool/graph/src/lib.rs +++ b/client/transaction-pool/graph/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Generic Transaction Pool //! //! The pool is based on dependency graph between transactions diff --git a/client/transaction-pool/graph/src/listener.rs b/client/transaction-pool/graph/src/listener.rs index 602c75e099..c8bf2c9d39 100644 --- a/client/transaction-pool/graph/src/listener.rs +++ b/client/transaction-pool/graph/src/listener.rs @@ -1,20 +1,21 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{ collections::HashMap, hash, }; diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index 0b817b155d..cef2f0b62e 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{ hash, collections::HashMap, diff --git a/client/transaction-pool/graph/src/ready.rs b/client/transaction-pool/graph/src/ready.rs index c856535a61..e759e318a1 100644 --- a/client/transaction-pool/graph/src/ready.rs +++ b/client/transaction-pool/graph/src/ready.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{ collections::{HashMap, HashSet, BTreeSet}, cmp, diff --git a/client/transaction-pool/graph/src/rotator.rs b/client/transaction-pool/graph/src/rotator.rs index be96174d1d..9ce6a43b1e 100644 --- a/client/transaction-pool/graph/src/rotator.rs +++ b/client/transaction-pool/graph/src/rotator.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Rotate extrinsic inside the pool. //! //! Keeps only recent extrinsic and discard the ones kept for a significant amount of time. diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 19f491bb1d..4a32c4c58c 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use std::{ collections::{HashSet, HashMap}, hash, diff --git a/client/transaction-pool/graph/src/watcher.rs b/client/transaction-pool/graph/src/watcher.rs index d54cc2718b..098e468d22 100644 --- a/client/transaction-pool/graph/src/watcher.rs +++ b/client/transaction-pool/graph/src/watcher.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Extrinsics status updates. use futures::Stream; diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index bd7e11a3a6..90d667d613 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Chain api required for the transaction pool. use std::{marker::PhantomData, pin::Pin, sync::Arc}; diff --git a/client/transaction-pool/src/error.rs b/client/transaction-pool/src/error.rs index fa48b387c4..feccf4a7b0 100644 --- a/client/transaction-pool/src/error.rs +++ b/client/transaction-pool/src/error.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Transaction pool error. use sp_transaction_pool::error::Error as TxPoolError; diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 12d3b3a30e..62b99ef505 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Substrate transaction pool implementation. #![recursion_limit="256"] diff --git a/client/transaction-pool/src/metrics.rs b/client/transaction-pool/src/metrics.rs index 74c41a1262..3b0e48cbfc 100644 --- a/client/transaction-pool/src/metrics.rs +++ b/client/transaction-pool/src/metrics.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Transaction pool Prometheus metrics. use std::sync::Arc; diff --git a/client/transaction-pool/src/revalidation.rs b/client/transaction-pool/src/revalidation.rs index f203bf08a0..f8f7280417 100644 --- a/client/transaction-pool/src/revalidation.rs +++ b/client/transaction-pool/src/revalidation.rs @@ -1,19 +1,20 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Pool periodic revalidation. use std::{sync::Arc, pin::Pin, collections::{HashMap, HashSet, BTreeMap}}; diff --git a/client/transaction-pool/src/testing/mod.rs b/client/transaction-pool/src/testing/mod.rs index a8f40c6b64..c4bf184a2b 100644 --- a/client/transaction-pool/src/testing/mod.rs +++ b/client/transaction-pool/src/testing/mod.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . //! Tests for top-level transaction pool api mod pool; diff --git a/client/transaction-pool/src/testing/pool.rs b/client/transaction-pool/src/testing/pool.rs index 45fb6f42c3..32701d3c2d 100644 --- a/client/transaction-pool/src/testing/pool.rs +++ b/client/transaction-pool/src/testing/pool.rs @@ -1,19 +1,20 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// Substrate is distributed in the hope that it will be useful, +// This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . - +// along with this program. If not, see . use crate::*; use sp_transaction_pool::TransactionStatus; use futures::executor::block_on; diff --git a/frame/assets/Cargo.toml b/frame/assets/Cargo.toml index 4e09ea8aa5..dc2a838d1c 100644 --- a/frame/assets/Cargo.toml +++ b/frame/assets/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-assets" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME asset management pallet" diff --git a/frame/assets/src/lib.rs b/frame/assets/src/lib.rs index 1aaedd4c74..6211694c94 100644 --- a/frame/assets/src/lib.rs +++ b/frame/assets/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Assets Module //! diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index 623cf80df7..cd7f17ba13 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-aura" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME AURA consensus pallet" diff --git a/frame/aura/src/lib.rs b/frame/aura/src/lib.rs index e2aafde9ef..d124ef0017 100644 --- a/frame/aura/src/lib.rs +++ b/frame/aura/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Aura Module //! diff --git a/frame/aura/src/mock.rs b/frame/aura/src/mock.rs index 8154ef4c9f..db4448bdef 100644 --- a/frame/aura/src/mock.rs +++ b/frame/aura/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/aura/src/tests.rs b/frame/aura/src/tests.rs index a7cb5503c4..ca0fc3de37 100644 --- a/frame/aura/src/tests.rs +++ b/frame/aura/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index 5f267b3159..134dff4017 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-authority-discovery" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for authority discovery" diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index ca3e293ae7..022ce36281 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Authority discovery module. //! diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index 98776c0e00..d5769783a9 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" description = "Block and Uncle Author tracking for the FRAME" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index e799ec2367..7605e78097 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Authorship tracking for FRAME runtimes. //! diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 631b4ac4d4..685e508a3d 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-babe" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Consensus extension module for BABE consensus. Collects on-chain randomness from VRF outputs and manages epoch transitions." diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index 209b7eea38..6d32c22249 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Consensus extension module for BABE consensus. Collects on-chain randomness //! from VRF outputs and manages epoch transitions. diff --git a/frame/babe/src/mock.rs b/frame/babe/src/mock.rs index 933c69c98a..bdeb284887 100644 --- a/frame/babe/src/mock.rs +++ b/frame/babe/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/babe/src/tests.rs b/frame/babe/src/tests.rs index af2ecd1e1a..be2d3ed036 100644 --- a/frame/babe/src/tests.rs +++ b/frame/babe/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Consensus extension module tests for BABE consensus. diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index 769e68112c..3916d5605f 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-balances" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet to manage balances" diff --git a/frame/balances/src/benchmarking.rs b/frame/balances/src/benchmarking.rs index 3c2067559f..a5f8e6fe36 100644 --- a/frame/balances/src/benchmarking.rs +++ b/frame/balances/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Balances pallet benchmarking. diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index b1d88edb03..d10909b739 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Balances Module //! diff --git a/frame/balances/src/tests.rs b/frame/balances/src/tests.rs index 7663b8922b..9cfdc147b4 100644 --- a/frame/balances/src/tests.rs +++ b/frame/balances/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Macro for creating the tests for the module. diff --git a/frame/balances/src/tests_composite.rs b/frame/balances/src/tests_composite.rs index 5d25fdb50c..e78171376c 100644 --- a/frame/balances/src/tests_composite.rs +++ b/frame/balances/src/tests_composite.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/balances/src/tests_local.rs b/frame/balances/src/tests_local.rs index afc0edbae7..736afe9cba 100644 --- a/frame/balances/src/tests_local.rs +++ b/frame/balances/src/tests_local.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/benchmark/Cargo.toml b/frame/benchmark/Cargo.toml index 0b506d12ec..7fab3642f2 100644 --- a/frame/benchmark/Cargo.toml +++ b/frame/benchmark/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-benchmark" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Patterns to benchmark in a FRAME runtime." diff --git a/frame/benchmark/src/benchmarking.rs b/frame/benchmark/src/benchmarking.rs index 1e4740da2c..ddf3df9eaa 100644 --- a/frame/benchmark/src/benchmarking.rs +++ b/frame/benchmark/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Benchmarks for common FRAME Pallet operations. diff --git a/frame/benchmark/src/lib.rs b/frame/benchmark/src/lib.rs index 037edc9d26..422272f817 100644 --- a/frame/benchmark/src/lib.rs +++ b/frame/benchmark/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A pallet that contains common runtime patterns in an isolated manner. //! This pallet is **not** meant to be used in a production blockchain, just diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index 8089a2a366..fcc8e0bf92 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-benchmarking" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Macro for benchmarking a FRAME runtime." diff --git a/frame/benchmarking/src/analysis.rs b/frame/benchmarking/src/analysis.rs index 1d30b86fc9..0446430975 100644 --- a/frame/benchmarking/src/analysis.rs +++ b/frame/benchmarking/src/analysis.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tools for analysing the benchmark results. diff --git a/frame/benchmarking/src/lib.rs b/frame/benchmarking/src/lib.rs index 8a9df7e4cf..27966545f7 100644 --- a/frame/benchmarking/src/lib.rs +++ b/frame/benchmarking/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Macro for benchmarking a FRAME runtime. diff --git a/frame/benchmarking/src/tests.rs b/frame/benchmarking/src/tests.rs index 67ad9b4d22..8418cb9081 100644 --- a/frame/benchmarking/src/tests.rs +++ b/frame/benchmarking/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/benchmarking/src/utils.rs b/frame/benchmarking/src/utils.rs index 41b968fbfc..31ec3783cc 100644 --- a/frame/benchmarking/src/utils.rs +++ b/frame/benchmarking/src/utils.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Interfaces, types and utils for benchmarking a FRAME runtime. diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index 2107bf0b2f..f2a7f46b06 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-collective" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Collective system: Members of a set of account IDs can make their collective feelings known through dispatched calls from one of two specialized origins." diff --git a/frame/collective/src/benchmarking.rs b/frame/collective/src/benchmarking.rs index 77473abef4..b9558d8c8c 100644 --- a/frame/collective/src/benchmarking.rs +++ b/frame/collective/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Staking pallet benchmarking. diff --git a/frame/collective/src/lib.rs b/frame/collective/src/lib.rs index 31c93bf71d..132320c7a3 100644 --- a/frame/collective/src/lib.rs +++ b/frame/collective/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Collective system: Members of a set of account IDs can make their collective feelings known //! through dispatched calls from one of two specialized origins. diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index 4e1128000e..3350e815b2 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-contracts" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for WASM contracts" diff --git a/frame/contracts/common/Cargo.toml b/frame/contracts/common/Cargo.toml index edf1867be0..d834be7437 100644 --- a/frame/contracts/common/Cargo.toml +++ b/frame/contracts/common/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-contracts-primitives" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "A crate that hosts a common definitions that are relevant for the pallet-contracts." diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index 66d75759f1..f3d32e7696 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-contracts-rpc" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Node-specific RPC methods for interaction with contracts." diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index 81c6ce3760..fdcfb5149a 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-contracts-rpc-runtime-api" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Runtime API definition required by Contracts RPC extensions." diff --git a/frame/contracts/rpc/runtime-api/src/lib.rs b/frame/contracts/rpc/runtime-api/src/lib.rs index 6fb629b024..84fd66826d 100644 --- a/frame/contracts/rpc/runtime-api/src/lib.rs +++ b/frame/contracts/rpc/runtime-api/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime API definition required by Contracts RPC extensions. //! diff --git a/frame/contracts/rpc/src/lib.rs b/frame/contracts/rpc/src/lib.rs index 53e8d93870..89f43f42c3 100644 --- a/frame/contracts/rpc/src/lib.rs +++ b/frame/contracts/rpc/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Node-specific RPC methods for interaction with contracts. diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 83caa671ce..9183b48f37 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-democracy" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for democracy" diff --git a/frame/democracy/src/benchmarking.rs b/frame/democracy/src/benchmarking.rs index d561138465..b60250a5a6 100644 --- a/frame/democracy/src/benchmarking.rs +++ b/frame/democracy/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Democracy pallet benchmarking. diff --git a/frame/democracy/src/conviction.rs b/frame/democracy/src/conviction.rs index a057ee2a35..bb563e4b74 100644 --- a/frame/democracy/src/conviction.rs +++ b/frame/democracy/src/conviction.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The conviction datatype. diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index a182907aba..1cf89f84c5 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Democracy Pallet //! diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index a835a0ff6e..2fa9bb2328 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The crate's tests. diff --git a/frame/democracy/src/tests/cancellation.rs b/frame/democracy/src/tests/cancellation.rs index 998b0c14d8..e75fd28109 100644 --- a/frame/democracy/src/tests/cancellation.rs +++ b/frame/democracy/src/tests/cancellation.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for cancelation functionality. diff --git a/frame/democracy/src/tests/delegation.rs b/frame/democracy/src/tests/delegation.rs index 061a48b587..34dec6d0b4 100644 --- a/frame/democracy/src/tests/delegation.rs +++ b/frame/democracy/src/tests/delegation.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for functionality concerning delegation. diff --git a/frame/democracy/src/tests/external_proposing.rs b/frame/democracy/src/tests/external_proposing.rs index a249a806ee..473eac81cd 100644 --- a/frame/democracy/src/tests/external_proposing.rs +++ b/frame/democracy/src/tests/external_proposing.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for functionality concerning the "external" origin. diff --git a/frame/democracy/src/tests/fast_tracking.rs b/frame/democracy/src/tests/fast_tracking.rs index 5ce9b15baf..8df34001cd 100644 --- a/frame/democracy/src/tests/fast_tracking.rs +++ b/frame/democracy/src/tests/fast_tracking.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for fast-tracking functionality. diff --git a/frame/democracy/src/tests/lock_voting.rs b/frame/democracy/src/tests/lock_voting.rs index e83d974a8d..9386703058 100644 --- a/frame/democracy/src/tests/lock_voting.rs +++ b/frame/democracy/src/tests/lock_voting.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for functionality concerning locking and lock-voting. diff --git a/frame/democracy/src/tests/preimage.rs b/frame/democracy/src/tests/preimage.rs index 7d977b0ba8..218a0cc25c 100644 --- a/frame/democracy/src/tests/preimage.rs +++ b/frame/democracy/src/tests/preimage.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The preimage tests. diff --git a/frame/democracy/src/tests/proxying.rs b/frame/democracy/src/tests/proxying.rs index 412adf6be0..2e39528e75 100644 --- a/frame/democracy/src/tests/proxying.rs +++ b/frame/democracy/src/tests/proxying.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for functionality concerning proxying. diff --git a/frame/democracy/src/tests/public_proposals.rs b/frame/democracy/src/tests/public_proposals.rs index 04246e86f1..c2103fd948 100644 --- a/frame/democracy/src/tests/public_proposals.rs +++ b/frame/democracy/src/tests/public_proposals.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for the public proposal queue. diff --git a/frame/democracy/src/tests/scheduling.rs b/frame/democracy/src/tests/scheduling.rs index db9724dedd..5bcfbae994 100644 --- a/frame/democracy/src/tests/scheduling.rs +++ b/frame/democracy/src/tests/scheduling.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for functionality concerning normal starting, ending and enacting of referenda. diff --git a/frame/democracy/src/tests/voting.rs b/frame/democracy/src/tests/voting.rs index 43aed29a32..9ae57797d1 100644 --- a/frame/democracy/src/tests/voting.rs +++ b/frame/democracy/src/tests/voting.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The tests for normal voting functionality. diff --git a/frame/democracy/src/types.rs b/frame/democracy/src/types.rs index 3454326364..efd52361f5 100644 --- a/frame/democracy/src/types.rs +++ b/frame/democracy/src/types.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Miscellaneous additional datatypes. diff --git a/frame/democracy/src/vote.rs b/frame/democracy/src/vote.rs index a41eb342aa..09ff0d71e4 100644 --- a/frame/democracy/src/vote.rs +++ b/frame/democracy/src/vote.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The vote datatype. diff --git a/frame/democracy/src/vote_threshold.rs b/frame/democracy/src/vote_threshold.rs index fd976b4400..2268a55936 100644 --- a/frame/democracy/src/vote_threshold.rs +++ b/frame/democracy/src/vote_threshold.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Voting thresholds. diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index f9d681b760..4fe85e7733 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-elections-phragmen" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME election pallet for PHRAGMEN" diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 05f4d1e83d..0133abc648 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Phragmen Election Module. //! diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index 407b5ccfdb..3109a13392 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-elections" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for elections" diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index a684ce3144..b87db45909 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Election module for stake-weighted membership selection of a collective. //! diff --git a/frame/elections/src/mock.rs b/frame/elections/src/mock.rs index c779f22a32..c433f8d036 100644 --- a/frame/elections/src/mock.rs +++ b/frame/elections/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock file for election module. diff --git a/frame/elections/src/tests.rs b/frame/elections/src/tests.rs index 64b01f12e0..590266f7fe 100644 --- a/frame/elections/src/tests.rs +++ b/frame/elections/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for election module. diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index eaa5ae3e42..c7aea6eb9b 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-evm" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME EVM contracts pallet" diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index c7aa8b8d3a..1c38e22917 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! EVM execution module for Substrate diff --git a/frame/example-offchain-worker/src/lib.rs b/frame/example-offchain-worker/src/lib.rs index c3a269e46d..aae51c6f27 100644 --- a/frame/example-offchain-worker/src/lib.rs +++ b/frame/example-offchain-worker/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Offchain Worker Example Module //! diff --git a/frame/example-offchain-worker/src/tests.rs b/frame/example-offchain-worker/src/tests.rs index ad0ae01d10..d94a989067 100644 --- a/frame/example-offchain-worker/src/tests.rs +++ b/frame/example-offchain-worker/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::*; diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 78ff803d37..23f21e30dc 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Example Pallet //! diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index 3e0e1c938a..84918f7361 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-executive" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME executives engine" diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 9c46d86d74..fcef03883b 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Executive Module //! diff --git a/frame/finality-tracker/Cargo.toml b/frame/finality-tracker/Cargo.toml index 1b11fbea5a..9c2019bfb5 100644 --- a/frame/finality-tracker/Cargo.toml +++ b/frame/finality-tracker/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-finality-tracker" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME Pallet that tracks the last finalized block, as perceived by block authors." diff --git a/frame/finality-tracker/src/lib.rs b/frame/finality-tracker/src/lib.rs index ac306e2689..e5065cd917 100644 --- a/frame/finality-tracker/src/lib.rs +++ b/frame/finality-tracker/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! FRAME Pallet that tracks the last finalized block, as perceived by block authors. diff --git a/frame/generic-asset/Cargo.toml b/frame/generic-asset/Cargo.toml index c19a7884b3..9b32d718ac 100644 --- a/frame/generic-asset/Cargo.toml +++ b/frame/generic-asset/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-generic-asset" version = "2.0.0-dev" authors = ["Centrality Developers "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for generic asset management" diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index 04547acaf1..7a9a00a282 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-grandpa" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for GRANDPA finality gadget" diff --git a/frame/grandpa/src/equivocation.rs b/frame/grandpa/src/equivocation.rs index 2a8c3e5722..7c6e5c6d66 100644 --- a/frame/grandpa/src/equivocation.rs +++ b/frame/grandpa/src/equivocation.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! //! An opt-in utility module for reporting equivocations. diff --git a/frame/grandpa/src/lib.rs b/frame/grandpa/src/lib.rs index 055607816d..43b6ba0b2f 100644 --- a/frame/grandpa/src/lib.rs +++ b/frame/grandpa/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! GRANDPA Consensus module for runtime. //! diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index f307f17fd4..13608db42a 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/grandpa/src/tests.rs b/frame/grandpa/src/tests.rs index 898c675835..e15021733f 100644 --- a/frame/grandpa/src/tests.rs +++ b/frame/grandpa/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/identity/Cargo.toml b/frame/identity/Cargo.toml index f20a8c983d..bfe2a7d492 100644 --- a/frame/identity/Cargo.toml +++ b/frame/identity/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-identity" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME identity management pallet" diff --git a/frame/identity/src/benchmarking.rs b/frame/identity/src/benchmarking.rs index 81a9f3e134..042f7aa9c7 100644 --- a/frame/identity/src/benchmarking.rs +++ b/frame/identity/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Identity pallet benchmarking. diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index c790203635..37ed8f8672 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Identity Module //! diff --git a/frame/im-online/Cargo.toml b/frame/im-online/Cargo.toml index 55e5a49d58..964bd2f69a 100644 --- a/frame/im-online/Cargo.toml +++ b/frame/im-online/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-im-online" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME's I'm online pallet" diff --git a/frame/im-online/src/benchmarking.rs b/frame/im-online/src/benchmarking.rs index dae2f719b6..63457168b3 100644 --- a/frame/im-online/src/benchmarking.rs +++ b/frame/im-online/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! I'm Online pallet benchmarking. diff --git a/frame/im-online/src/lib.rs b/frame/im-online/src/lib.rs index 7815db7072..c1c93910ec 100644 --- a/frame/im-online/src/lib.rs +++ b/frame/im-online/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # I'm online Module //! diff --git a/frame/im-online/src/mock.rs b/frame/im-online/src/mock.rs index 7ba9dd19f9..9d67e78eef 100644 --- a/frame/im-online/src/mock.rs +++ b/frame/im-online/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/im-online/src/tests.rs b/frame/im-online/src/tests.rs index 2578b5114e..7619781b68 100644 --- a/frame/im-online/src/tests.rs +++ b/frame/im-online/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the im-online module. diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index 515c0b478d..db0f4cbf55 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-indices" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME indices management pallet" diff --git a/frame/indices/src/address.rs b/frame/indices/src/address.rs index f4487eeb69..0fd8933381 100644 --- a/frame/indices/src/address.rs +++ b/frame/indices/src/address.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Address type that is union of index and id for an account. diff --git a/frame/indices/src/lib.rs b/frame/indices/src/lib.rs index 8c17fed592..77a73a21ac 100644 --- a/frame/indices/src/lib.rs +++ b/frame/indices/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! An index is a short form of an address. This module handles allocation //! of indices for a newly created accounts. diff --git a/frame/indices/src/mock.rs b/frame/indices/src/mock.rs index aa7057e61a..62f6c93cae 100644 --- a/frame/indices/src/mock.rs +++ b/frame/indices/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/indices/src/tests.rs b/frame/indices/src/tests.rs index 9e434cfbe2..7f416afbd3 100644 --- a/frame/indices/src/tests.rs +++ b/frame/indices/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/membership/Cargo.toml b/frame/membership/Cargo.toml index 742cc124a2..befca54ad1 100644 --- a/frame/membership/Cargo.toml +++ b/frame/membership/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-membership" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME membership management pallet" diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index faf2be8e11..9dd1c8ecfc 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Membership Module //! diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index 73418be9b2..1241c3b4ab 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-metadata" version = "11.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Decodable variant of the RuntimeMetadata." diff --git a/frame/metadata/src/lib.rs b/frame/metadata/src/lib.rs index bec69999b2..c0eeb76b6f 100644 --- a/frame/metadata/src/lib.rs +++ b/frame/metadata/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Decodable variant of the RuntimeMetadata. //! diff --git a/frame/nicks/Cargo.toml b/frame/nicks/Cargo.toml index fcb6473105..140a48523b 100644 --- a/frame/nicks/Cargo.toml +++ b/frame/nicks/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-nicks" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for nick management" diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 3088e7b68d..205544cdd2 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Nicks Module //! diff --git a/frame/offences/Cargo.toml b/frame/offences/Cargo.toml index e0759325fe..ebb31d680d 100644 --- a/frame/offences/Cargo.toml +++ b/frame/offences/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-offences" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME offences pallet" diff --git a/frame/offences/benchmarking/Cargo.toml b/frame/offences/benchmarking/Cargo.toml index 7b998176eb..ff77497db0 100644 --- a/frame/offences/benchmarking/Cargo.toml +++ b/frame/offences/benchmarking/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-offences-benchmarking" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME offences pallet benchmarking" diff --git a/frame/offences/benchmarking/src/lib.rs b/frame/offences/benchmarking/src/lib.rs index a0e05a74d5..1d726aedbb 100644 --- a/frame/offences/benchmarking/src/lib.rs +++ b/frame/offences/benchmarking/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Offences pallet benchmarking. diff --git a/frame/offences/benchmarking/src/mock.rs b/frame/offences/benchmarking/src/mock.rs index 20cf337d44..76cd017690 100644 --- a/frame/offences/benchmarking/src/mock.rs +++ b/frame/offences/benchmarking/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock file for offences benchmarking. diff --git a/frame/offences/src/lib.rs b/frame/offences/src/lib.rs index b877d1e2b2..dd1b052811 100644 --- a/frame/offences/src/lib.rs +++ b/frame/offences/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Offences Module //! diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index 595d091ea4..3a407654a2 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/offences/src/tests.rs b/frame/offences/src/tests.rs index 3179a07523..b05fee1790 100644 --- a/frame/offences/src/tests.rs +++ b/frame/offences/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the offences module. diff --git a/frame/randomness-collective-flip/Cargo.toml b/frame/randomness-collective-flip/Cargo.toml index 08d715899f..2c6e733cae 100644 --- a/frame/randomness-collective-flip/Cargo.toml +++ b/frame/randomness-collective-flip/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-randomness-collective-flip" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME randomness collective flip pallet" diff --git a/frame/randomness-collective-flip/src/lib.rs b/frame/randomness-collective-flip/src/lib.rs index 29068ea91f..16f54fbc44 100644 --- a/frame/randomness-collective-flip/src/lib.rs +++ b/frame/randomness-collective-flip/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Randomness Module //! diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml index de422678c3..b0a5982714 100644 --- a/frame/recovery/Cargo.toml +++ b/frame/recovery/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-recovery" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME account recovery pallet" diff --git a/frame/recovery/src/lib.rs b/frame/recovery/src/lib.rs index 008461e503..cd3ba76b37 100644 --- a/frame/recovery/src/lib.rs +++ b/frame/recovery/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Recovery Pallet //! diff --git a/frame/recovery/src/mock.rs b/frame/recovery/src/mock.rs index 648321a0ae..6345eac5a0 100644 --- a/frame/recovery/src/mock.rs +++ b/frame/recovery/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/recovery/src/tests.rs b/frame/recovery/src/tests.rs index fb993043a5..5192bdaca8 100644 --- a/frame/recovery/src/tests.rs +++ b/frame/recovery/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/scheduler/src/benchmarking.rs b/frame/scheduler/src/benchmarking.rs index ac9c19f7c3..975c10e3b6 100644 --- a/frame/scheduler/src/benchmarking.rs +++ b/frame/scheduler/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Scheduler pallet benchmarking. diff --git a/frame/scheduler/src/lib.rs b/frame/scheduler/src/lib.rs index 029e1fd138..08f53cc592 100644 --- a/frame/scheduler/src/lib.rs +++ b/frame/scheduler/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Scheduler //! diff --git a/frame/scored-pool/Cargo.toml b/frame/scored-pool/Cargo.toml index ae8def3dd3..83d1402957 100644 --- a/frame/scored-pool/Cargo.toml +++ b/frame/scored-pool/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-scored-pool" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for scored pools" diff --git a/frame/scored-pool/src/lib.rs b/frame/scored-pool/src/lib.rs index 1ba999cc7c..ba56298493 100644 --- a/frame/scored-pool/src/lib.rs +++ b/frame/scored-pool/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Scored Pool Module //! diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index 6d914c60aa..aae86973a9 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/scored-pool/src/tests.rs b/frame/scored-pool/src/tests.rs index 8d87a20f75..9c0074ff6e 100644 --- a/frame/scored-pool/src/tests.rs +++ b/frame/scored-pool/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index 9237f0a16f..b03eea494a 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-session" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME sessions pallet" diff --git a/frame/session/benchmarking/Cargo.toml b/frame/session/benchmarking/Cargo.toml index a3994ab379..d263e1af9a 100644 --- a/frame/session/benchmarking/Cargo.toml +++ b/frame/session/benchmarking/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-session-benchmarking" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME sessions pallet benchmarking" diff --git a/frame/session/benchmarking/src/lib.rs b/frame/session/benchmarking/src/lib.rs index 3b91c2fdc5..04b7d55602 100644 --- a/frame/session/benchmarking/src/lib.rs +++ b/frame/session/benchmarking/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Benchmarks for the Session Pallet. // This is separated into its own crate due to cyclic dependency issues. diff --git a/frame/session/benchmarking/src/mock.rs b/frame/session/benchmarking/src/mock.rs index 5a7082dabb..9ec017cf22 100644 --- a/frame/session/benchmarking/src/mock.rs +++ b/frame/session/benchmarking/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock file for session benchmarking. diff --git a/frame/session/src/historical.rs b/frame/session/src/historical.rs index d9711ecf9d..a1c286eb39 100644 --- a/frame/session/src/historical.rs +++ b/frame/session/src/historical.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! An opt-in utility for tracking historical sessions in FRAME-session. //! diff --git a/frame/session/src/lib.rs b/frame/session/src/lib.rs index 167cf8bcdb..47517702cc 100644 --- a/frame/session/src/lib.rs +++ b/frame/session/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Session Module //! diff --git a/frame/session/src/mock.rs b/frame/session/src/mock.rs index 9e9b877658..30fb35b282 100644 --- a/frame/session/src/mock.rs +++ b/frame/session/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock helpers for Session. diff --git a/frame/session/src/tests.rs b/frame/session/src/tests.rs index abfd9f738b..75def78046 100644 --- a/frame/session/src/tests.rs +++ b/frame/session/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // Tests for the Session Pallet diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index d79eb78b7d..24380aff55 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-society" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME society pallet" diff --git a/frame/society/src/lib.rs b/frame/society/src/lib.rs index fcc0c66ebd..122ed06b29 100644 --- a/frame/society/src/lib.rs +++ b/frame/society/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Society Module //! diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index 121ec59555..3b5cb550a4 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/society/src/tests.rs b/frame/society/src/tests.rs index 8b10dc32e7..8f18ecba46 100644 --- a/frame/society/src/tests.rs +++ b/frame/society/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 3ee07b5dec..022baa0f13 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-staking" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet staking" diff --git a/frame/staking/fuzzer/Cargo.toml b/frame/staking/fuzzer/Cargo.toml index 812e5b2fc1..c717dd8598 100644 --- a/frame/staking/fuzzer/Cargo.toml +++ b/frame/staking/fuzzer/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0" authors = ["Automatically generated"] publish = false edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet staking fuzzing" diff --git a/frame/staking/fuzzer/src/mock.rs b/frame/staking/fuzzer/src/mock.rs index 1819970e60..b1e7ed273c 100644 --- a/frame/staking/fuzzer/src/mock.rs +++ b/frame/staking/fuzzer/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock file for staking fuzzing. diff --git a/frame/staking/fuzzer/src/submit_solution.rs b/frame/staking/fuzzer/src/submit_solution.rs index cc897abac2..067ab0c631 100644 --- a/frame/staking/fuzzer/src/submit_solution.rs +++ b/frame/staking/fuzzer/src/submit_solution.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Fuzzing for staking pallet. diff --git a/frame/staking/reward-curve/Cargo.toml b/frame/staking/reward-curve/Cargo.toml index b11d1cc049..b5ec29060a 100644 --- a/frame/staking/reward-curve/Cargo.toml +++ b/frame/staking/reward-curve/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-staking-reward-curve" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Reward Curve for FRAME staking pallet" diff --git a/frame/staking/reward-curve/src/lib.rs b/frame/staking/reward-curve/src/lib.rs index 5a3d88bb53..9b55b346d5 100644 --- a/frame/staking/reward-curve/src/lib.rs +++ b/frame/staking/reward-curve/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Proc macro to generate the reward curve functions and tests. diff --git a/frame/staking/reward-curve/tests/test.rs b/frame/staking/reward-curve/tests/test.rs index 89f8653fe1..45ad59e00a 100644 --- a/frame/staking/reward-curve/tests/test.rs +++ b/frame/staking/reward-curve/tests/test.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test crate for pallet-staking-reward-curve. Allows to test for procedural macro. //! See tests directory. diff --git a/frame/staking/src/benchmarking.rs b/frame/staking/src/benchmarking.rs index 8c5f70daef..cd6d0badd0 100644 --- a/frame/staking/src/benchmarking.rs +++ b/frame/staking/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Staking pallet benchmarking. diff --git a/frame/staking/src/inflation.rs b/frame/staking/src/inflation.rs index 63d008a197..04bfc98357 100644 --- a/frame/staking/src/inflation.rs +++ b/frame/staking/src/inflation.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! This module expose one function `P_NPoS` (Payout NPoS) or `compute_total_payout` which returns //! the total payout for the era given the era duration and the staking rate in NPoS. diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 9d6ff12b1f..54e7b5aaaf 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Staking Module //! diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 9c908f6145..a2d53f6895 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/staking/src/offchain_election.rs b/frame/staking/src/offchain_election.rs index 2568638319..4e32d75f21 100644 --- a/frame/staking/src/offchain_election.rs +++ b/frame/staking/src/offchain_election.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Helpers for offchain worker election. diff --git a/frame/staking/src/slashing.rs b/frame/staking/src/slashing.rs index 7dccf24cb2..4e43b754b8 100644 --- a/frame/staking/src/slashing.rs +++ b/frame/staking/src/slashing.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A slashing implementation for NPoS systems. //! diff --git a/frame/staking/src/testing_utils.rs b/frame/staking/src/testing_utils.rs index ede14c8cf7..6a95838a09 100644 --- a/frame/staking/src/testing_utils.rs +++ b/frame/staking/src/testing_utils.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Testing utils for staking. Needs the `testing-utils` feature to be enabled. //! diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 637f8a32dd..80ffc4b7bf 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/sudo/Cargo.toml b/frame/sudo/Cargo.toml index 25988b1fe3..bbceac1496 100644 --- a/frame/sudo/Cargo.toml +++ b/frame/sudo/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-sudo" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for sudo" diff --git a/frame/sudo/src/lib.rs b/frame/sudo/src/lib.rs index eed23a86fb..3d5d1b2582 100644 --- a/frame/sudo/src/lib.rs +++ b/frame/sudo/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Sudo Module //! diff --git a/frame/sudo/src/mock.rs b/frame/sudo/src/mock.rs index b8298182c5..e853a29f39 100644 --- a/frame/sudo/src/mock.rs +++ b/frame/sudo/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utilities diff --git a/frame/sudo/src/tests.rs b/frame/sudo/src/tests.rs index 5a7c0ed10b..79424d2824 100644 --- a/frame/sudo/src/tests.rs +++ b/frame/sudo/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the module. diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 0168705da7..3213f0dfe4 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-support" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Support code for the runtime." diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 55e5513432..4d05685f9d 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-support-procedural" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Proc macro of Support code for the runtime." diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index b74a27e7ba..d7529cd272 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. mod parse; diff --git a/frame/support/procedural/src/construct_runtime/parse.rs b/frame/support/procedural/src/construct_runtime/parse.rs index 4a81a7efd6..92a71687cc 100644 --- a/frame/support/procedural/src/construct_runtime/parse.rs +++ b/frame/support/procedural/src/construct_runtime/parse.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use frame_support_procedural_tools::syn_ext as ext; use proc_macro2::Span; diff --git a/frame/support/procedural/src/lib.rs b/frame/support/procedural/src/lib.rs index 17b1efdcd4..df5665ec48 100644 --- a/frame/support/procedural/src/lib.rs +++ b/frame/support/procedural/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Proc macro of Support code for the runtime. diff --git a/frame/support/procedural/src/storage/genesis_config/builder_def.rs b/frame/support/procedural/src/storage/genesis_config/builder_def.rs index 87255ee481..d134108af9 100644 --- a/frame/support/procedural/src/storage/genesis_config/builder_def.rs +++ b/frame/support/procedural/src/storage/genesis_config/builder_def.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Builder logic definition used to build genesis storage. diff --git a/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs b/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs index 9b6ddc9217..6339134ea0 100644 --- a/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs +++ b/frame/support/procedural/src/storage/genesis_config/genesis_config_def.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Genesis config definition. diff --git a/frame/support/procedural/src/storage/genesis_config/mod.rs b/frame/support/procedural/src/storage/genesis_config/mod.rs index eeeca150d9..7cc0f7c3be 100644 --- a/frame/support/procedural/src/storage/genesis_config/mod.rs +++ b/frame/support/procedural/src/storage/genesis_config/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Declaration of genesis config structure and implementation of build storage trait and //! functions. diff --git a/frame/support/procedural/src/storage/getters.rs b/frame/support/procedural/src/storage/getters.rs index ae0e646fcd..5507db4630 100644 --- a/frame/support/procedural/src/storage/getters.rs +++ b/frame/support/procedural/src/storage/getters.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Implementation of getters on module structure. diff --git a/frame/support/procedural/src/storage/instance_trait.rs b/frame/support/procedural/src/storage/instance_trait.rs index b2f0ad9c06..1e5e198a8c 100644 --- a/frame/support/procedural/src/storage/instance_trait.rs +++ b/frame/support/procedural/src/storage/instance_trait.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Implementation of the trait instance and the instance structures implementing it. //! (For not instantiable traits there is still the inherent instance implemented). diff --git a/frame/support/procedural/src/storage/metadata.rs b/frame/support/procedural/src/storage/metadata.rs index bb23c99d9d..065320cd01 100644 --- a/frame/support/procedural/src/storage/metadata.rs +++ b/frame/support/procedural/src/storage/metadata.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Implementation of `storage_metadata` on module structure, used by construct_runtime. diff --git a/frame/support/procedural/src/storage/mod.rs b/frame/support/procedural/src/storage/mod.rs index e8599c52a9..766141f5aa 100644 --- a/frame/support/procedural/src/storage/mod.rs +++ b/frame/support/procedural/src/storage/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! `decl_storage` input definition and expansion. diff --git a/frame/support/procedural/src/storage/parse.rs b/frame/support/procedural/src/storage/parse.rs index beb9beff70..5a3bb3f40c 100644 --- a/frame/support/procedural/src/storage/parse.rs +++ b/frame/support/procedural/src/storage/parse.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Parsing of decl_storage input. diff --git a/frame/support/procedural/src/storage/storage_struct.rs b/frame/support/procedural/src/storage/storage_struct.rs index cbd477354e..6052dbfd4a 100644 --- a/frame/support/procedural/src/storage/storage_struct.rs +++ b/frame/support/procedural/src/storage/storage_struct.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Implementation of storage structures and implementation of storage traits on them. diff --git a/frame/support/procedural/src/storage/store_trait.rs b/frame/support/procedural/src/storage/store_trait.rs index 96281e408e..7efe65b5f3 100644 --- a/frame/support/procedural/src/storage/store_trait.rs +++ b/frame/support/procedural/src/storage/store_trait.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Declaration of store trait and implementation on module structure. diff --git a/frame/support/procedural/tools/Cargo.toml b/frame/support/procedural/tools/Cargo.toml index f64ad9b1e6..5e5e0eb4c4 100644 --- a/frame/support/procedural/tools/Cargo.toml +++ b/frame/support/procedural/tools/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-support-procedural-tools" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Proc macro helpers for procedural macros" diff --git a/frame/support/procedural/tools/derive/Cargo.toml b/frame/support/procedural/tools/derive/Cargo.toml index 75721508e8..7cc657e685 100644 --- a/frame/support/procedural/tools/derive/Cargo.toml +++ b/frame/support/procedural/tools/derive/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-support-procedural-tools-derive" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Use to derive parsing for parsing struct." diff --git a/frame/support/procedural/tools/derive/src/lib.rs b/frame/support/procedural/tools/derive/src/lib.rs index 0c5930892b..ec5af13b67 100644 --- a/frame/support/procedural/tools/derive/src/lib.rs +++ b/frame/support/procedural/tools/derive/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Use to derive parsing for parsing struct. diff --git a/frame/support/procedural/tools/src/lib.rs b/frame/support/procedural/tools/src/lib.rs index 102fee0e18..0033787a7c 100644 --- a/frame/support/procedural/tools/src/lib.rs +++ b/frame/support/procedural/tools/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Proc macro helpers for procedural macros diff --git a/frame/support/procedural/tools/src/syn_ext.rs b/frame/support/procedural/tools/src/syn_ext.rs index 4577437232..2ba4cf3f28 100644 --- a/frame/support/procedural/tools/src/syn_ext.rs +++ b/frame/support/procedural/tools/src/syn_ext.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Extension to syn types, mainly for parsing diff --git a/frame/support/src/debug.rs b/frame/support/src/debug.rs index 4b7ff6cc39..e4a4806846 100644 --- a/frame/support/src/debug.rs +++ b/frame/support/src/debug.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime debugging and logging utilities. //! diff --git a/frame/support/src/dispatch.rs b/frame/support/src/dispatch.rs index df887fa2c4..dd4b6d0b86 100644 --- a/frame/support/src/dispatch.rs +++ b/frame/support/src/dispatch.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Dispatch system. Contains a macro for defining runtime modules and //! generating values representing lazy module function calls. diff --git a/frame/support/src/error.rs b/frame/support/src/error.rs index 115920f39a..456ef3c461 100644 --- a/frame/support/src/error.rs +++ b/frame/support/src/error.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Macro for declaring a module error. diff --git a/frame/support/src/hash.rs b/frame/support/src/hash.rs index 40cb1f612f..a5de205863 100644 --- a/frame/support/src/hash.rs +++ b/frame/support/src/hash.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Hash utilities. diff --git a/frame/support/src/inherent.rs b/frame/support/src/inherent.rs index 4e09bf9dd8..8bc99db9e2 100644 --- a/frame/support/src/inherent.rs +++ b/frame/support/src/inherent.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[doc(hidden)] pub use crate::sp_std::vec::Vec; diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 6bad5985ab..a05561173b 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Support code for the runtime. diff --git a/frame/support/src/metadata.rs b/frame/support/src/metadata.rs index 081f392b9e..7248d6bc4d 100644 --- a/frame/support/src/metadata.rs +++ b/frame/support/src/metadata.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub use frame_metadata::{ DecodeDifferent, FnEncode, RuntimeMetadata, ModuleMetadata, RuntimeMetadataLastVersion, diff --git a/frame/support/src/origin.rs b/frame/support/src/origin.rs index 43d2e70953..f96ec07af0 100644 --- a/frame/support/src/origin.rs +++ b/frame/support/src/origin.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Macros that define an Origin type. Every function call to your runtime has an origin which //! specifies where the extrinsic was generated from. diff --git a/frame/support/src/storage/child.rs b/frame/support/src/storage/child.rs index 658908d258..431b5e0930 100644 --- a/frame/support/src/storage/child.rs +++ b/frame/support/src/storage/child.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Operation on runtime child storages. //! diff --git a/frame/support/src/storage/generator/double_map.rs b/frame/support/src/storage/generator/double_map.rs index 722a9dcabc..ff83aaf8ec 100644 --- a/frame/support/src/storage/generator/double_map.rs +++ b/frame/support/src/storage/generator/double_map.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_std::prelude::*; use sp_std::borrow::Borrow; diff --git a/frame/support/src/storage/generator/map.rs b/frame/support/src/storage/generator/map.rs index fa870ac075..fe932b7979 100644 --- a/frame/support/src/storage/generator/map.rs +++ b/frame/support/src/storage/generator/map.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[cfg(not(feature = "std"))] use sp_std::prelude::*; diff --git a/frame/support/src/storage/generator/mod.rs b/frame/support/src/storage/generator/mod.rs index 07e75055f3..7df7dfd317 100644 --- a/frame/support/src/storage/generator/mod.rs +++ b/frame/support/src/storage/generator/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generators are a set of trait on which storage traits are implemented. //! diff --git a/frame/support/src/storage/generator/value.rs b/frame/support/src/storage/generator/value.rs index 9cc36b6372..2da3d91718 100644 --- a/frame/support/src/storage/generator/value.rs +++ b/frame/support/src/storage/generator/value.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{FullCodec, Encode, EncodeLike, Decode}; use crate::{ diff --git a/frame/support/src/storage/hashed.rs b/frame/support/src/storage/hashed.rs index a3ffddcb84..96a487111a 100644 --- a/frame/support/src/storage/hashed.rs +++ b/frame/support/src/storage/hashed.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Operation on runtime storage using hashed keys. diff --git a/frame/support/src/storage/migration.rs b/frame/support/src/storage/migration.rs index 264c3c644e..75f90ba7b0 100644 --- a/frame/support/src/storage/migration.rs +++ b/frame/support/src/storage/migration.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Some utilities for helping access storage with arbitrary key types. diff --git a/frame/support/src/storage/mod.rs b/frame/support/src/storage/mod.rs index 9214d931e3..6d0ef91ce1 100644 --- a/frame/support/src/storage/mod.rs +++ b/frame/support/src/storage/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Stuff to do with the runtime's storage. diff --git a/frame/support/src/storage/unhashed.rs b/frame/support/src/storage/unhashed.rs index 1ecf46ef18..34b146b86f 100644 --- a/frame/support/src/storage/unhashed.rs +++ b/frame/support/src/storage/unhashed.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Operation on unhashed runtime storage. diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index bd03720220..99a5abcbac 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Traits for FRAME. //! diff --git a/frame/support/src/unsigned.rs b/frame/support/src/unsigned.rs index 3bc6f692af..16c434fe63 100644 --- a/frame/support/src/unsigned.rs +++ b/frame/support/src/unsigned.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[doc(hidden)] pub use crate::sp_runtime::traits::ValidateUnsigned; diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index 1d3862b60f..27f2aef586 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Primitives for transaction weighting. //! diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 77899788d2..59014d893c 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-support-test" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" publish = false homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/frame/support/test/src/lib.rs b/frame/support/test/src/lib.rs index f62f552268..c0baf448ee 100644 --- a/frame/support/test/src/lib.rs +++ b/frame/support/test/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test crate for frame_support. Allow to make use of `frame_support::decl_storage`. //! See tests directory. diff --git a/frame/support/test/tests/construct_runtime_ui.rs b/frame/support/test/tests/construct_runtime_ui.rs index d094d73ba5..e1624c7683 100644 --- a/frame/support/test/tests/construct_runtime_ui.rs +++ b/frame/support/test/tests/construct_runtime_ui.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use std::env; diff --git a/frame/support/test/tests/decl_error.rs b/frame/support/test/tests/decl_error.rs index eb14ae7502..9536d4e819 100644 --- a/frame/support/test/tests/decl_error.rs +++ b/frame/support/test/tests/decl_error.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #![recursion_limit="128"] diff --git a/frame/support/test/tests/decl_storage.rs b/frame/support/test/tests/decl_storage.rs index 5ec5bbecfe..cda1d810d2 100644 --- a/frame/support/test/tests/decl_storage.rs +++ b/frame/support/test/tests/decl_storage.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[cfg(test)] // Do not complain about unused `dispatch` and `dispatch_aux`. diff --git a/frame/support/test/tests/decl_storage_ui.rs b/frame/support/test/tests/decl_storage_ui.rs index 3aee5e9866..d771b6e0ee 100644 --- a/frame/support/test/tests/decl_storage_ui.rs +++ b/frame/support/test/tests/decl_storage_ui.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[test] fn decl_storage_ui() { diff --git a/frame/support/test/tests/decl_storage_ui/config_duplicate.rs b/frame/support/test/tests/decl_storage_ui/config_duplicate.rs index 0f2759e740..4d510da9f8 100644 --- a/frame/support/test/tests/decl_storage_ui/config_duplicate.rs +++ b/frame/support/test/tests/decl_storage_ui/config_duplicate.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub trait Trait { type Origin; diff --git a/frame/support/test/tests/decl_storage_ui/config_duplicate.stderr b/frame/support/test/tests/decl_storage_ui/config_duplicate.stderr index 761e3f3b79..61f7c0bbe6 100644 --- a/frame/support/test/tests/decl_storage_ui/config_duplicate.stderr +++ b/frame/support/test/tests/decl_storage_ui/config_duplicate.stderr @@ -1,5 +1,5 @@ error: `config()`/`get()` with the same name already defined. - --> $DIR/config_duplicate.rs:29:21 + --> $DIR/config_duplicate.rs:30:21 | -29 | pub Value2 config(value): u32; +30 | pub Value2 config(value): u32; | ^^^^^ diff --git a/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs b/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs index a4e0158d5c..49897e6251 100644 --- a/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs +++ b/frame/support/test/tests/decl_storage_ui/config_get_duplicate.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub trait Trait { type Origin; diff --git a/frame/support/test/tests/decl_storage_ui/config_get_duplicate.stderr b/frame/support/test/tests/decl_storage_ui/config_get_duplicate.stderr index 34d040f4e1..02e7d41080 100644 --- a/frame/support/test/tests/decl_storage_ui/config_get_duplicate.stderr +++ b/frame/support/test/tests/decl_storage_ui/config_get_duplicate.stderr @@ -1,5 +1,5 @@ error: `config()`/`get()` with the same name already defined. - --> $DIR/config_get_duplicate.rs:29:21 + --> $DIR/config_get_duplicate.rs:30:21 | -29 | pub Value2 config(value): u32; +30 | pub Value2 config(value): u32; | ^^^^^ diff --git a/frame/support/test/tests/decl_storage_ui/get_duplicate.rs b/frame/support/test/tests/decl_storage_ui/get_duplicate.rs index 9edbc25bf9..2fa78f4d17 100644 --- a/frame/support/test/tests/decl_storage_ui/get_duplicate.rs +++ b/frame/support/test/tests/decl_storage_ui/get_duplicate.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub trait Trait { type Origin; diff --git a/frame/support/test/tests/decl_storage_ui/get_duplicate.stderr b/frame/support/test/tests/decl_storage_ui/get_duplicate.stderr index 130244196f..d9ce420a6f 100644 --- a/frame/support/test/tests/decl_storage_ui/get_duplicate.stderr +++ b/frame/support/test/tests/decl_storage_ui/get_duplicate.stderr @@ -1,5 +1,5 @@ error: `config()`/`get()` with the same name already defined. - --> $DIR/get_duplicate.rs:29:21 + --> $DIR/get_duplicate.rs:30:21 | -29 | pub Value2 get(fn value) config(): u32; +30 | pub Value2 get(fn value) config(): u32; | ^^^^^ diff --git a/frame/support/test/tests/final_keys.rs b/frame/support/test/tests/final_keys.rs index ae23c5a64c..e88389ade7 100644 --- a/frame/support/test/tests/final_keys.rs +++ b/frame/support/test/tests/final_keys.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use frame_support::storage::unhashed; use codec::Encode; diff --git a/frame/support/test/tests/genesisconfig.rs b/frame/support/test/tests/genesisconfig.rs index bccffb7374..78b841d295 100644 --- a/frame/support/test/tests/genesisconfig.rs +++ b/frame/support/test/tests/genesisconfig.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub trait Trait { type BlockNumber: codec::Codec + codec::EncodeLike + Default; diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index 5cb7fa1972..45e280902a 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #![recursion_limit="128"] diff --git a/frame/support/test/tests/issue2219.rs b/frame/support/test/tests/issue2219.rs index 8d8152a5ad..cd357ba266 100644 --- a/frame/support/test/tests/issue2219.rs +++ b/frame/support/test/tests/issue2219.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use frame_support::sp_runtime::generic; use frame_support::sp_runtime::traits::{BlakeTwo256, Block as _, Verify}; diff --git a/frame/support/test/tests/reserved_keyword.rs b/frame/support/test/tests/reserved_keyword.rs index 6f2bbb4747..382b2e4987 100644 --- a/frame/support/test/tests/reserved_keyword.rs +++ b/frame/support/test/tests/reserved_keyword.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[rustversion::attr(not(stable), ignore)] #[test] diff --git a/frame/support/test/tests/system.rs b/frame/support/test/tests/system.rs index c7f60117bc..821224d0a2 100644 --- a/frame/support/test/tests/system.rs +++ b/frame/support/test/tests/system.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use frame_support::codec::{Encode, Decode, EncodeLike}; diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 0e90009a16..099290f2c7 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-system" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME system module" diff --git a/frame/system/benches/bench.rs b/frame/system/benches/bench.rs index 6594862e5c..6c25e5d1c9 100644 --- a/frame/system/benches/bench.rs +++ b/frame/system/benches/bench.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use criterion::{Criterion, criterion_group, criterion_main, black_box}; use frame_system as system; diff --git a/frame/system/benchmarking/Cargo.toml b/frame/system/benchmarking/Cargo.toml index 0518bd705d..60ee030011 100644 --- a/frame/system/benchmarking/Cargo.toml +++ b/frame/system/benchmarking/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-system-benchmarking" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME System benchmarking" diff --git a/frame/system/benchmarking/src/lib.rs b/frame/system/benchmarking/src/lib.rs index 22e6dba842..049fa5298c 100644 --- a/frame/system/benchmarking/src/lib.rs +++ b/frame/system/benchmarking/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // Benchmarks for Utility Pallet diff --git a/frame/system/benchmarking/src/mock.rs b/frame/system/benchmarking/src/mock.rs index 1e72665c15..ed65f4df93 100644 --- a/frame/system/benchmarking/src/mock.rs +++ b/frame/system/benchmarking/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock file for system benchmarking. diff --git a/frame/system/rpc/runtime-api/Cargo.toml b/frame/system/rpc/runtime-api/Cargo.toml index 2097e11266..d0644931ae 100644 --- a/frame/system/rpc/runtime-api/Cargo.toml +++ b/frame/system/rpc/runtime-api/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-system-rpc-runtime-api" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Runtime API definition required by System RPC extensions." diff --git a/frame/system/rpc/runtime-api/src/lib.rs b/frame/system/rpc/runtime-api/src/lib.rs index 3b05bd1624..0ead94aabe 100644 --- a/frame/system/rpc/runtime-api/src/lib.rs +++ b/frame/system/rpc/runtime-api/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime API definition required by System RPC extensions. //! diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index f1e04c5424..e2516740d3 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # System Module //! diff --git a/frame/system/src/offchain.rs b/frame/system/src/offchain.rs index 43003d657e..42699362a3 100644 --- a/frame/system/src/offchain.rs +++ b/frame/system/src/offchain.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Module helpers for off-chain calls. //! diff --git a/frame/timestamp/Cargo.toml b/frame/timestamp/Cargo.toml index 7691421bbf..49abf80254 100644 --- a/frame/timestamp/Cargo.toml +++ b/frame/timestamp/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-timestamp" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME Timestamp Module" diff --git a/frame/timestamp/src/benchmarking.rs b/frame/timestamp/src/benchmarking.rs index c468bf82fb..fd2d285698 100644 --- a/frame/timestamp/src/benchmarking.rs +++ b/frame/timestamp/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Timestamp pallet benchmarking. diff --git a/frame/timestamp/src/lib.rs b/frame/timestamp/src/lib.rs index cb27fc711f..e886f8079f 100644 --- a/frame/timestamp/src/lib.rs +++ b/frame/timestamp/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Timestamp Module //! diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index a969f30086..0f8b05c3dd 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-transaction-payment" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet to manage transaction payments" diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index 35f421915a..3851c988e2 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-transaction-payment-rpc" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "RPC interface for the transaction payment module." diff --git a/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/frame/transaction-payment/rpc/runtime-api/Cargo.toml index 1170e043ee..f8e948ea10 100644 --- a/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-transaction-payment-rpc-runtime-api" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "RPC runtime API for transaction payment FRAME pallet" diff --git a/frame/transaction-payment/rpc/runtime-api/src/lib.rs b/frame/transaction-payment/rpc/runtime-api/src/lib.rs index 77b6e3b454..4392807338 100644 --- a/frame/transaction-payment/rpc/runtime-api/src/lib.rs +++ b/frame/transaction-payment/rpc/runtime-api/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime API definition for transaction payment module. diff --git a/frame/transaction-payment/rpc/src/lib.rs b/frame/transaction-payment/rpc/src/lib.rs index 945b0119d7..d99907a6ac 100644 --- a/frame/transaction-payment/rpc/src/lib.rs +++ b/frame/transaction-payment/rpc/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! RPC interface for the transaction payment module. diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index f6334c658a..42004021d6 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Transaction Payment Module //! diff --git a/frame/treasury/Cargo.toml b/frame/treasury/Cargo.toml index c00ae225c1..9b031c4a0c 100644 --- a/frame/treasury/Cargo.toml +++ b/frame/treasury/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-treasury" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet to manage treasury" diff --git a/frame/treasury/src/benchmarking.rs b/frame/treasury/src/benchmarking.rs index f901576c95..8dddf3581a 100644 --- a/frame/treasury/src/benchmarking.rs +++ b/frame/treasury/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Treasury pallet benchmarking. diff --git a/frame/treasury/src/lib.rs b/frame/treasury/src/lib.rs index 270a710a2c..d1fed8fa28 100644 --- a/frame/treasury/src/lib.rs +++ b/frame/treasury/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Treasury Module //! diff --git a/frame/treasury/src/tests.rs b/frame/treasury/src/tests.rs index 18b1d1c50e..606abf7765 100644 --- a/frame/treasury/src/tests.rs +++ b/frame/treasury/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Treasury pallet tests. diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index a830f8ab5b..fff5513682 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-utility" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME utilities pallet" diff --git a/frame/utility/src/benchmarking.rs b/frame/utility/src/benchmarking.rs index fc8783b49a..4e77c8e44a 100644 --- a/frame/utility/src/benchmarking.rs +++ b/frame/utility/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // Benchmarks for Utility Pallet diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 1ff71af535..6692848609 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Utility Module //! A module with helpers for dispatch management. diff --git a/frame/utility/src/tests.rs b/frame/utility/src/tests.rs index 360ff78d30..7dfc58350d 100644 --- a/frame/utility/src/tests.rs +++ b/frame/utility/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // Tests for Utility Pallet diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml index 79430990c3..96282db360 100644 --- a/frame/vesting/Cargo.toml +++ b/frame/vesting/Cargo.toml @@ -3,7 +3,7 @@ name = "pallet-vesting" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME pallet for manage vesting" diff --git a/frame/vesting/src/benchmarking.rs b/frame/vesting/src/benchmarking.rs index 10f19af65e..24cdc28c97 100644 --- a/frame/vesting/src/benchmarking.rs +++ b/frame/vesting/src/benchmarking.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Vesting pallet benchmarking. diff --git a/frame/vesting/src/lib.rs b/frame/vesting/src/lib.rs index 6d1b88efbc..a6748b15ce 100644 --- a/frame/vesting/src/lib.rs +++ b/frame/vesting/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Vesting Module //! diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml index 8530e0df0e..d56b4e34b2 100644 --- a/primitives/allocator/Cargo.toml +++ b/primitives/allocator/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-allocator" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Collection of allocator implementations." diff --git a/primitives/allocator/src/error.rs b/primitives/allocator/src/error.rs index 9357bc4560..7b634af4d5 100644 --- a/primitives/allocator/src/error.rs +++ b/primitives/allocator/src/error.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. /// The error type used by the allocators. #[derive(sp_core::RuntimeDebug)] diff --git a/primitives/allocator/src/freeing_bump.rs b/primitives/allocator/src/freeing_bump.rs index 0d15ed11f7..a9cb89c55b 100644 --- a/primitives/allocator/src/freeing_bump.rs +++ b/primitives/allocator/src/freeing_bump.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! This module implements a freeing-bump allocator. //! diff --git a/primitives/allocator/src/lib.rs b/primitives/allocator/src/lib.rs index 0efadbc7f6..b7cfce8048 100644 --- a/primitives/allocator/src/lib.rs +++ b/primitives/allocator/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Collection of allocator implementations. //! diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 43decc4f6e..f82bcac77e 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-api" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate runtime api primitives" diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index a970b3e750..46f804f32c 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-api-proc-macro" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Macros for declaring and implementing runtime apis." diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index 440176bc46..7e1391b7b5 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::utils::{ generate_crate_access, generate_hidden_includes, generate_runtime_mod_name_for_trait, diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index 72c833a18c..2878bd2c13 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::utils::{ generate_crate_access, generate_hidden_includes, diff --git a/primitives/api/proc-macro/src/lib.rs b/primitives/api/proc-macro/src/lib.rs index 12f435bd16..4dd4809468 100644 --- a/primitives/api/proc-macro/src/lib.rs +++ b/primitives/api/proc-macro/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Macros for declaring and implementing runtime apis. diff --git a/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs b/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs index 0767c804a6..028ef57939 100644 --- a/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::utils::{ generate_crate_access, generate_hidden_includes, diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 1a79cf6c1e..534ddcfddd 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use proc_macro2::{TokenStream, Span}; diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index f8a22c4566..ec15c1eae7 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate runtime api //! diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index a945399f1b..9e2d894a01 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-api-test" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" publish = false homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/api/test/benches/bench.rs b/primitives/api/test/benches/bench.rs index 9a90ca6e38..280b707902 100644 --- a/primitives/api/test/benches/bench.rs +++ b/primitives/api/test/benches/bench.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use criterion::{Criterion, criterion_group, criterion_main}; use substrate_test_runtime_client::{ diff --git a/primitives/api/test/tests/decl_and_impl.rs b/primitives/api/test/tests/decl_and_impl.rs index 4a8c8cd662..f16f0bbe71 100644 --- a/primitives/api/test/tests/decl_and_impl.rs +++ b/primitives/api/test/tests/decl_and_impl.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_api::{ RuntimeApiInfo, decl_runtime_apis, impl_runtime_apis, mock_impl_runtime_apis, diff --git a/primitives/api/test/tests/runtime_calls.rs b/primitives/api/test/tests/runtime_calls.rs index a907ac8095..555104446a 100644 --- a/primitives/api/test/tests/runtime_calls.rs +++ b/primitives/api/test/tests/runtime_calls.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_api::ProvideRuntimeApi; use substrate_test_runtime_client::{ diff --git a/primitives/api/test/tests/trybuild.rs b/primitives/api/test/tests/trybuild.rs index 910771f938..2f7fd6d06b 100644 --- a/primitives/api/test/tests/trybuild.rs +++ b/primitives/api/test/tests/trybuild.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use std::env; diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index be9e5e5a11..b350dee843 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" description = "Provides facilities for generating application specific crypto wrapper types." -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" documentation = "https://docs.rs/sp-application-crypto" diff --git a/primitives/application-crypto/src/ed25519.rs b/primitives/application-crypto/src/ed25519.rs index c35cb30457..e761745cf5 100644 --- a/primitives/application-crypto/src/ed25519.rs +++ b/primitives/application-crypto/src/ed25519.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Ed25519 crypto types. diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index 9fa82deca7..2e244b4212 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Traits and macros for constructing application specific strongly typed crypto wrappers. diff --git a/primitives/application-crypto/src/sr25519.rs b/primitives/application-crypto/src/sr25519.rs index cd1472f617..4700e0f756 100644 --- a/primitives/application-crypto/src/sr25519.rs +++ b/primitives/application-crypto/src/sr25519.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Sr25519 crypto types. diff --git a/primitives/application-crypto/src/traits.rs b/primitives/application-crypto/src/traits.rs index 05ff03c2ce..f06e194aef 100644 --- a/primitives/application-crypto/src/traits.rs +++ b/primitives/application-crypto/src/traits.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[cfg(feature = "full_crypto")] use sp_core::crypto::Pair; diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index 47b477ddd3..6e2c81f3a6 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" description = "Integration tests for application-crypto" -license = "GPL-3.0" +license = "Apache-2.0" publish = false homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/application-crypto/test/src/ed25519.rs b/primitives/application-crypto/test/src/ed25519.rs index 1d72962829..ecdaabc30f 100644 --- a/primitives/application-crypto/test/src/ed25519.rs +++ b/primitives/application-crypto/test/src/ed25519.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Integration tests for ed25519 diff --git a/primitives/application-crypto/test/src/lib.rs b/primitives/application-crypto/test/src/lib.rs index cb045e81a7..5ff528cee4 100644 --- a/primitives/application-crypto/test/src/lib.rs +++ b/primitives/application-crypto/test/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Integration tests for application crypto diff --git a/primitives/application-crypto/test/src/sr25519.rs b/primitives/application-crypto/test/src/sr25519.rs index f2c7c48b2b..55aaf1eac4 100644 --- a/primitives/application-crypto/test/src/sr25519.rs +++ b/primitives/application-crypto/test/src/sr25519.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Integration tests for sr25519 diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index 70efb4ac4a..c22706e32e 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-arithmetic" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Minimal fixed point arithmetic primitives and types for runtime." diff --git a/primitives/arithmetic/benches/bench.rs b/primitives/arithmetic/benches/bench.rs index 1dbcf260af..7a576c8af1 100644 --- a/primitives/arithmetic/benches/bench.rs +++ b/primitives/arithmetic/benches/bench.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use criterion::{Criterion, Throughput, BenchmarkId, criterion_group, criterion_main}; use sp_arithmetic::biguint::{BigUint, Single}; diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index f145c2cd90..fdcf691762 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-arithmetic-fuzzer" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Fuzzer for fixed point arithmetic primitives." diff --git a/primitives/arithmetic/fuzzer/src/biguint.rs b/primitives/arithmetic/fuzzer/src/biguint.rs index f217b080d2..0966c12895 100644 --- a/primitives/arithmetic/fuzzer/src/biguint.rs +++ b/primitives/arithmetic/fuzzer/src/biguint.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Running //! Running this fuzzer can be done with `cargo hfuzz run biguint`. `honggfuzz` CLI options can diff --git a/primitives/arithmetic/fuzzer/src/per_thing_rational.rs b/primitives/arithmetic/fuzzer/src/per_thing_rational.rs index c2dda3de22..0820a35100 100644 --- a/primitives/arithmetic/fuzzer/src/per_thing_rational.rs +++ b/primitives/arithmetic/fuzzer/src/per_thing_rational.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Running //! Running this fuzzer can be done with `cargo hfuzz run per_thing_rational`. `honggfuzz` CLI options can diff --git a/primitives/arithmetic/fuzzer/src/rational128.rs b/primitives/arithmetic/fuzzer/src/rational128.rs index 586a165272..7a33e46991 100644 --- a/primitives/arithmetic/fuzzer/src/rational128.rs +++ b/primitives/arithmetic/fuzzer/src/rational128.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # Running //! Running this fuzzer can be done with `cargo hfuzz run rational128`. `honggfuzz` CLI options can diff --git a/primitives/arithmetic/src/biguint.rs b/primitives/arithmetic/src/biguint.rs index 6c3ca58a52..a1e5ea2666 100644 --- a/primitives/arithmetic/src/biguint.rs +++ b/primitives/arithmetic/src/biguint.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Infinite precision unsigned integer for substrate runtime. diff --git a/primitives/arithmetic/src/fixed128.rs b/primitives/arithmetic/src/fixed128.rs index a0fafe5ee3..6682b37949 100644 --- a/primitives/arithmetic/src/fixed128.rs +++ b/primitives/arithmetic/src/fixed128.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Decode, Encode}; use primitive_types::U256; diff --git a/primitives/arithmetic/src/fixed64.rs b/primitives/arithmetic/src/fixed64.rs index 819982aa50..14baad543c 100644 --- a/primitives/arithmetic/src/fixed64.rs +++ b/primitives/arithmetic/src/fixed64.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_std::{ ops, prelude::*, diff --git a/primitives/arithmetic/src/helpers_128bit.rs b/primitives/arithmetic/src/helpers_128bit.rs index bf8315b9b6..1e332f54d3 100644 --- a/primitives/arithmetic/src/helpers_128bit.rs +++ b/primitives/arithmetic/src/helpers_128bit.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Some helper functions to work with 128bit numbers. Note that the functionality provided here is //! only sensible to use with 128bit numbers because for smaller sizes, you can always rely on diff --git a/primitives/arithmetic/src/lib.rs b/primitives/arithmetic/src/lib.rs index fb70b13a15..e5e7139d7b 100644 --- a/primitives/arithmetic/src/lib.rs +++ b/primitives/arithmetic/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Minimal fixed point arithmetic primitives and types for runtime. diff --git a/primitives/arithmetic/src/per_things.rs b/primitives/arithmetic/src/per_things.rs index 56fc562cd1..b50b35f7af 100644 --- a/primitives/arithmetic/src/per_things.rs +++ b/primitives/arithmetic/src/per_things.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #[cfg(feature = "std")] use serde::{Serialize, Deserialize}; diff --git a/primitives/arithmetic/src/rational128.rs b/primitives/arithmetic/src/rational128.rs index 248df70794..9d0d10921d 100644 --- a/primitives/arithmetic/src/rational128.rs +++ b/primitives/arithmetic/src/rational128.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_std::{cmp::Ordering, prelude::*}; use crate::helpers_128bit; diff --git a/primitives/arithmetic/src/traits.rs b/primitives/arithmetic/src/traits.rs index 4201a41364..d8d789577e 100644 --- a/primitives/arithmetic/src/traits.rs +++ b/primitives/arithmetic/src/traits.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitive traits for the runtime arithmetic. diff --git a/primitives/authority-discovery/Cargo.toml b/primitives/authority-discovery/Cargo.toml index 32f67d5e6e..286a2e3141 100644 --- a/primitives/authority-discovery/Cargo.toml +++ b/primitives/authority-discovery/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Authority discovery primitives" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/authority-discovery/src/lib.rs b/primitives/authority-discovery/src/lib.rs index 0f434bd313..8903a7f383 100644 --- a/primitives/authority-discovery/src/lib.rs +++ b/primitives/authority-discovery/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime Api to help discover authorities. diff --git a/primitives/authorship/Cargo.toml b/primitives/authorship/Cargo.toml index 7bc01953ef..0888878ab8 100644 --- a/primitives/authorship/Cargo.toml +++ b/primitives/authorship/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Authorship primitives" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/authorship/src/lib.rs b/primitives/authorship/src/lib.rs index 53dac56dc4..a760c546a2 100644 --- a/primitives/authorship/src/lib.rs +++ b/primitives/authorship/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Authorship Primitives diff --git a/primitives/block-builder/Cargo.toml b/primitives/block-builder/Cargo.toml index 70bb5e12d3..b9793621c9 100644 --- a/primitives/block-builder/Cargo.toml +++ b/primitives/block-builder/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-block-builder" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "The block builder runtime api." diff --git a/primitives/block-builder/src/lib.rs b/primitives/block-builder/src/lib.rs index 732c937c1a..6367a18afa 100644 --- a/primitives/block-builder/src/lib.rs +++ b/primitives/block-builder/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The block builder runtime api. diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index d5cf80b775..9eb619ccb9 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-blockchain" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate blockchain traits and primitives." diff --git a/primitives/blockchain/src/backend.rs b/primitives/blockchain/src/backend.rs index 45d627a1c2..1328dfb575 100644 --- a/primitives/blockchain/src/backend.rs +++ b/primitives/blockchain/src/backend.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate blockchain trait diff --git a/primitives/blockchain/src/error.rs b/primitives/blockchain/src/error.rs index e479b8abe9..17c276d870 100644 --- a/primitives/blockchain/src/error.rs +++ b/primitives/blockchain/src/error.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate client possible errors. diff --git a/primitives/blockchain/src/header_metadata.rs b/primitives/blockchain/src/header_metadata.rs index b7df03187d..a4df04b507 100644 --- a/primitives/blockchain/src/header_metadata.rs +++ b/primitives/blockchain/src/header_metadata.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Implements tree backend, cached header metadata and algorithms //! to compute routes efficiently over the tree of headers. diff --git a/primitives/blockchain/src/lib.rs b/primitives/blockchain/src/lib.rs index 8f83c7aec5..27b9c3585e 100644 --- a/primitives/blockchain/src/lib.rs +++ b/primitives/blockchain/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate blockchain traits and primitives. diff --git a/primitives/chain-spec/Cargo.toml b/primitives/chain-spec/Cargo.toml index 585decc68d..1d482c5970 100644 --- a/primitives/chain-spec/Cargo.toml +++ b/primitives/chain-spec/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-chain-spec" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate chain configurations types." diff --git a/primitives/chain-spec/src/lib.rs b/primitives/chain-spec/src/lib.rs index 13ebc09b6c..869fae8236 100644 --- a/primitives/chain-spec/src/lib.rs +++ b/primitives/chain-spec/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Types and traits related to chain specifications. diff --git a/primitives/consensus/aura/Cargo.toml b/primitives/consensus/aura/Cargo.toml index 574b80bd3d..b907b5689b 100644 --- a/primitives/consensus/aura/Cargo.toml +++ b/primitives/consensus/aura/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/consensus/aura/src/inherents.rs b/primitives/consensus/aura/src/inherents.rs index 77ec03c6f4..a18bd33703 100644 --- a/primitives/consensus/aura/src/inherents.rs +++ b/primitives/consensus/aura/src/inherents.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. /// Contains the inherents for the AURA module diff --git a/primitives/consensus/aura/src/lib.rs b/primitives/consensus/aura/src/lib.rs index 2dda5b28bf..cf0bcf2218 100644 --- a/primitives/consensus/aura/src/lib.rs +++ b/primitives/consensus/aura/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitives for Aura. diff --git a/primitives/consensus/babe/Cargo.toml b/primitives/consensus/babe/Cargo.toml index ca097d6a32..6a5da2788f 100644 --- a/primitives/consensus/babe/Cargo.toml +++ b/primitives/consensus/babe/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/consensus/babe/src/digests.rs b/primitives/consensus/babe/src/digests.rs index 24be9b1b14..4b625abe9f 100644 --- a/primitives/consensus/babe/src/digests.rs +++ b/primitives/consensus/babe/src/digests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Private implementation details of BABE digests. diff --git a/primitives/consensus/babe/src/inherents.rs b/primitives/consensus/babe/src/inherents.rs index 7c0744ac6e..5384183f9e 100644 --- a/primitives/consensus/babe/src/inherents.rs +++ b/primitives/consensus/babe/src/inherents.rs @@ -1,18 +1,20 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . //! Inherents for BABE use sp_inherents::{Error, InherentData, InherentIdentifier}; diff --git a/primitives/consensus/babe/src/lib.rs b/primitives/consensus/babe/src/lib.rs index 5f26349ef9..9848715a47 100644 --- a/primitives/consensus/babe/src/lib.rs +++ b/primitives/consensus/babe/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitives for BABE. #![deny(warnings)] diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 7101dde2fc..1125059913 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-consensus" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Common utilities for building and using consensus engines in substrate." diff --git a/primitives/consensus/common/src/block_import.rs b/primitives/consensus/common/src/block_import.rs index eb90ac9f1d..5e593da116 100644 --- a/primitives/consensus/common/src/block_import.rs +++ b/primitives/consensus/common/src/block_import.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Block import helpers. diff --git a/primitives/consensus/common/src/error.rs b/primitives/consensus/common/src/error.rs index d7e396223a..5e4dde80ba 100644 --- a/primitives/consensus/common/src/error.rs +++ b/primitives/consensus/common/src/error.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Error types in Consensus use sp_version::RuntimeVersion; diff --git a/primitives/consensus/common/src/evaluation.rs b/primitives/consensus/common/src/evaluation.rs index 5542042fed..76fcd5310b 100644 --- a/primitives/consensus/common/src/evaluation.rs +++ b/primitives/consensus/common/src/evaluation.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Block evaluation and evaluation errors. diff --git a/primitives/consensus/common/src/import_queue.rs b/primitives/consensus/common/src/import_queue.rs index 2da0bcac0c..85e82cc484 100644 --- a/primitives/consensus/common/src/import_queue.rs +++ b/primitives/consensus/common/src/import_queue.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Import Queue primitive: something which can verify and import blocks. //! diff --git a/primitives/consensus/common/src/import_queue/basic_queue.rs b/primitives/consensus/common/src/import_queue/basic_queue.rs index f2b830e890..8b27dba4c3 100644 --- a/primitives/consensus/common/src/import_queue/basic_queue.rs +++ b/primitives/consensus/common/src/import_queue/basic_queue.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use std::{mem, pin::Pin, time::Duration, marker::PhantomData}; use futures::{prelude::*, task::Context, task::Poll}; diff --git a/primitives/consensus/common/src/import_queue/buffered_link.rs b/primitives/consensus/common/src/import_queue/buffered_link.rs index ea77fc97f0..d85121a710 100644 --- a/primitives/consensus/common/src/import_queue/buffered_link.rs +++ b/primitives/consensus/common/src/import_queue/buffered_link.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Provides the `buffered_link` utility. //! diff --git a/primitives/consensus/common/src/offline_tracker.rs b/primitives/consensus/common/src/offline_tracker.rs index b4959503b1..9269640ffc 100644 --- a/primitives/consensus/common/src/offline_tracker.rs +++ b/primitives/consensus/common/src/offline_tracker.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tracks offline validators. diff --git a/primitives/consensus/pow/Cargo.toml b/primitives/consensus/pow/Cargo.toml index a7bcb6a000..aedc50ab51 100644 --- a/primitives/consensus/pow/Cargo.toml +++ b/primitives/consensus/pow/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/consensus/pow/src/lib.rs b/primitives/consensus/pow/src/lib.rs index fa8f75d1be..79c9b6f16c 100644 --- a/primitives/consensus/pow/src/lib.rs +++ b/primitives/consensus/pow/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitives for Substrate Proof-of-Work (PoW) consensus. diff --git a/primitives/consensus/vrf/Cargo.toml b/primitives/consensus/vrf/Cargo.toml index 92d8a77cb4..fce027e7a0 100644 --- a/primitives/consensus/vrf/Cargo.toml +++ b/primitives/consensus/vrf/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for VRF based consensus" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" repository = "https://github.com/paritytech/substrate/" homepage = "https://substrate.dev" diff --git a/primitives/consensus/vrf/src/lib.rs b/primitives/consensus/vrf/src/lib.rs index 4ec6e376d6..430e11974b 100644 --- a/primitives/consensus/vrf/src/lib.rs +++ b/primitives/consensus/vrf/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitives for VRF-based consensus engines. #![cfg_attr(not(feature = "std"), no_std)] diff --git a/primitives/consensus/vrf/src/schnorrkel.rs b/primitives/consensus/vrf/src/schnorrkel.rs index c1c2a7c21a..65e6837586 100644 --- a/primitives/consensus/vrf/src/schnorrkel.rs +++ b/primitives/consensus/vrf/src/schnorrkel.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Schnorrkel-based VRF. diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 2ab23d23c4..d0da1d533a 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-core" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Shareable Substrate types." diff --git a/primitives/core/benches/bench.rs b/primitives/core/benches/bench.rs index 7db9d72e6b..335920c4d2 100644 --- a/primitives/core/benches/bench.rs +++ b/primitives/core/benches/bench.rs @@ -13,6 +13,7 @@ // limitations under the License. + #[macro_use] extern crate criterion; diff --git a/primitives/core/src/changes_trie.rs b/primitives/core/src/changes_trie.rs index cb21ffe13d..1d88242e43 100644 --- a/primitives/core/src/changes_trie.rs +++ b/primitives/core/src/changes_trie.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate changes trie configuration. diff --git a/primitives/core/src/crypto.rs b/primitives/core/src/crypto.rs index 769bf20bfc..73134dcbfa 100644 --- a/primitives/core/src/crypto.rs +++ b/primitives/core/src/crypto.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Cryptographic utilities. diff --git a/primitives/core/src/ecdsa.rs b/primitives/core/src/ecdsa.rs index b04a379a3d..c5aba0bb40 100644 --- a/primitives/core/src/ecdsa.rs +++ b/primitives/core/src/ecdsa.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Simple ECDSA API. diff --git a/primitives/core/src/ed25519.rs b/primitives/core/src/ed25519.rs index cc62b49784..f6e7227013 100644 --- a/primitives/core/src/ed25519.rs +++ b/primitives/core/src/ed25519.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Simple Ed25519 API. diff --git a/primitives/core/src/hash.rs b/primitives/core/src/hash.rs index 424fefbe6a..20a6788c32 100644 --- a/primitives/core/src/hash.rs +++ b/primitives/core/src/hash.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A fixed hash type. diff --git a/primitives/core/src/hasher.rs b/primitives/core/src/hasher.rs index 28da432da7..96a79bf5f6 100644 --- a/primitives/core/src/hasher.rs +++ b/primitives/core/src/hasher.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate Blake2b Hasher implementation diff --git a/primitives/core/src/hashing.rs b/primitives/core/src/hashing.rs index d958da6c32..f61700a5a4 100644 --- a/primitives/core/src/hashing.rs +++ b/primitives/core/src/hashing.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Hashing functions. diff --git a/primitives/core/src/hexdisplay.rs b/primitives/core/src/hexdisplay.rs index 14fedc205c..f4c8fea8f2 100644 --- a/primitives/core/src/hexdisplay.rs +++ b/primitives/core/src/hexdisplay.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Wrapper type for byte collections that outputs hex. diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index 9da56018e9..91bdf6683d 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Shareable Substrate types. diff --git a/primitives/core/src/offchain/mod.rs b/primitives/core/src/offchain/mod.rs index e792d71afc..1d77e10f59 100644 --- a/primitives/core/src/offchain/mod.rs +++ b/primitives/core/src/offchain/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Offchain workers types diff --git a/primitives/core/src/offchain/storage.rs b/primitives/core/src/offchain/storage.rs index 830c25392b..1826015b0d 100644 --- a/primitives/core/src/offchain/storage.rs +++ b/primitives/core/src/offchain/storage.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! In-memory implementation of offchain workers database. diff --git a/primitives/core/src/offchain/testing.rs b/primitives/core/src/offchain/testing.rs index b889374a47..5e25e433a3 100644 --- a/primitives/core/src/offchain/testing.rs +++ b/primitives/core/src/offchain/testing.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Utilities for offchain calls testing. //! diff --git a/primitives/core/src/sandbox.rs b/primitives/core/src/sandbox.rs index 73fbcfb572..4cb5bd41d5 100644 --- a/primitives/core/src/sandbox.rs +++ b/primitives/core/src/sandbox.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Definition of a sandbox environment. diff --git a/primitives/core/src/sr25519.rs b/primitives/core/src/sr25519.rs index 7af1ed6d5a..9e9aaf53bb 100644 --- a/primitives/core/src/sr25519.rs +++ b/primitives/core/src/sr25519.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Simple sr25519 (Schnorr-Ristretto) API. diff --git a/primitives/core/src/tasks.rs b/primitives/core/src/tasks.rs index 199a185e53..9a181255ec 100644 --- a/primitives/core/src/tasks.rs +++ b/primitives/core/src/tasks.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Module for low-level asynchronous processing. diff --git a/primitives/core/src/testing.rs b/primitives/core/src/testing.rs index f818865d21..73332c6f5b 100644 --- a/primitives/core/src/testing.rs +++ b/primitives/core/src/testing.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Types that should only be used for testing! diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index 133a4a4e19..b768e0def8 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Shareable Substrate traits. diff --git a/primitives/core/src/u32_trait.rs b/primitives/core/src/u32_trait.rs index 975b4aa909..6f73e1f6ba 100644 --- a/primitives/core/src/u32_trait.rs +++ b/primitives/core/src/u32_trait.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! An u32 trait with "values" as impl'd types. diff --git a/primitives/core/src/uint.rs b/primitives/core/src/uint.rs index e666137c08..ef1adc4a0e 100644 --- a/primitives/core/src/uint.rs +++ b/primitives/core/src/uint.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! An unsigned fixed-size integer. diff --git a/primitives/database/Cargo.toml b/primitives/database/Cargo.toml index ee5871a637..ef65a8b940 100644 --- a/primitives/database/Cargo.toml +++ b/primitives/database/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-database" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate database trait." diff --git a/primitives/database/src/kvdb.rs b/primitives/database/src/kvdb.rs index 85a324b5c1..e05320deed 100644 --- a/primitives/database/src/kvdb.rs +++ b/primitives/database/src/kvdb.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. /// A wrapper around `kvdb::Database` that implements `sp_database::Database` trait diff --git a/primitives/database/src/lib.rs b/primitives/database/src/lib.rs index bd9bd2eb54..bc4c11f60a 100644 --- a/primitives/database/src/lib.rs +++ b/primitives/database/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The main database trait, allowing Substrate to store data persistently. diff --git a/primitives/database/src/mem.rs b/primitives/database/src/mem.rs index 09d6149bed..cbfc4f31d9 100644 --- a/primitives/database/src/mem.rs +++ b/primitives/database/src/mem.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! In-memory implementation of `Database` diff --git a/primitives/debug-derive/Cargo.toml b/primitives/debug-derive/Cargo.toml index a3e9d91fd2..d620d2bc71 100644 --- a/primitives/debug-derive/Cargo.toml +++ b/primitives/debug-derive/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-debug-derive" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Macros to derive runtime debug implementation." diff --git a/primitives/debug-derive/src/impls.rs b/primitives/debug-derive/src/impls.rs index b0e6dfa3ee..1757b294d9 100644 --- a/primitives/debug-derive/src/impls.rs +++ b/primitives/debug-derive/src/impls.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use quote::quote; use proc_macro2::TokenStream; diff --git a/primitives/debug-derive/src/lib.rs b/primitives/debug-derive/src/lib.rs index 68bbb94e1b..db370f8908 100644 --- a/primitives/debug-derive/src/lib.rs +++ b/primitives/debug-derive/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Macros to derive runtime debug implementation. //! diff --git a/primitives/debug-derive/tests/tests.rs b/primitives/debug-derive/tests/tests.rs index 77b3d53a2d..6a03762b1c 100644 --- a/primitives/debug-derive/tests/tests.rs +++ b/primitives/debug-derive/tests/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_debug_derive::RuntimeDebug; diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 9d7cd1df6b..31dde81d7e 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "sp-externalities" version = "0.8.0-dev" -license = "GPL-3.0" +license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/primitives/externalities/src/extensions.rs b/primitives/externalities/src/extensions.rs index f38f256bb9..c75877e67d 100644 --- a/primitives/externalities/src/extensions.rs +++ b/primitives/externalities/src/extensions.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Externalities extensions storage. //! diff --git a/primitives/externalities/src/lib.rs b/primitives/externalities/src/lib.rs index 2b584b512e..cfb1d0878a 100644 --- a/primitives/externalities/src/lib.rs +++ b/primitives/externalities/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate externalities abstraction //! diff --git a/primitives/externalities/src/scope_limited.rs b/primitives/externalities/src/scope_limited.rs index 263858aa5f..1f70276f02 100644 --- a/primitives/externalities/src/scope_limited.rs +++ b/primitives/externalities/src/scope_limited.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Stores the externalities in an `environmental` value to make it scope limited available. diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index 3f0d3f0d14..36af9319e7 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-finality-grandpa" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Primitives for GRANDPA integration, suitable for WASM compilation." diff --git a/primitives/finality-grandpa/src/lib.rs b/primitives/finality-grandpa/src/lib.rs index 7cc8ddf5cc..2e81c8cecb 100644 --- a/primitives/finality-grandpa/src/lib.rs +++ b/primitives/finality-grandpa/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitives for GRANDPA integration, suitable for WASM compilation. diff --git a/primitives/finality-tracker/Cargo.toml b/primitives/finality-tracker/Cargo.toml index a111c62675..9e40cb8551 100644 --- a/primitives/finality-tracker/Cargo.toml +++ b/primitives/finality-tracker/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-finality-tracker" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME module that tracks the last finalized block, as perceived by block authors." diff --git a/primitives/finality-tracker/src/lib.rs b/primitives/finality-tracker/src/lib.rs index a7157139dc..fea4003905 100644 --- a/primitives/finality-tracker/src/lib.rs +++ b/primitives/finality-tracker/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! FRAME module that tracks the last finalized block, as perceived by block authors. diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 084d275882..287f4d7b9d 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-inherents" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Provides types and traits for creating and checking inherents." diff --git a/primitives/inherents/src/lib.rs b/primitives/inherents/src/lib.rs index e63382cdf2..9894296953 100644 --- a/primitives/inherents/src/lib.rs +++ b/primitives/inherents/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Provides types and traits for creating and checking inherents. //! diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 93c8cc9d38..2bba4e94cb 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-io" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "I/O for Substrate runtimes" diff --git a/primitives/io/src/batch_verifier.rs b/primitives/io/src/batch_verifier.rs index ab2ee629d3..4f10d786e6 100644 --- a/primitives/io/src/batch_verifier.rs +++ b/primitives/io/src/batch_verifier.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Batch/parallel verification. diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index f5d692469f..0ab811d087 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! I/O host interface for substrate runtime. diff --git a/primitives/keyring/Cargo.toml b/primitives/keyring/Cargo.toml index 23e243239a..b9fe7cb7a0 100644 --- a/primitives/keyring/Cargo.toml +++ b/primitives/keyring/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-keyring" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Keyring support code for the runtime. A set of test accounts." diff --git a/primitives/keyring/src/ed25519.rs b/primitives/keyring/src/ed25519.rs index 197b9ded87..1788202738 100644 --- a/primitives/keyring/src/ed25519.rs +++ b/primitives/keyring/src/ed25519.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Support code for the runtime. A set of test accounts. diff --git a/primitives/keyring/src/lib.rs b/primitives/keyring/src/lib.rs index 18f8cdf2c4..55ed14d294 100644 --- a/primitives/keyring/src/lib.rs +++ b/primitives/keyring/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Support code for the runtime. A set of test accounts. diff --git a/primitives/keyring/src/sr25519.rs b/primitives/keyring/src/sr25519.rs index 476997f2db..80397f0de9 100644 --- a/primitives/keyring/src/sr25519.rs +++ b/primitives/keyring/src/sr25519.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Support code for the runtime. A set of test accounts. diff --git a/primitives/offchain/Cargo.toml b/primitives/offchain/Cargo.toml index ebd0fa12d4..1ed6c3342a 100644 --- a/primitives/offchain/Cargo.toml +++ b/primitives/offchain/Cargo.toml @@ -2,7 +2,7 @@ description = "Substrate offchain workers primitives" name = "sp-offchain" version = "2.0.0-dev" -license = "GPL-3.0" +license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/primitives/offchain/src/lib.rs b/primitives/offchain/src/lib.rs index 8f043d712a..fa5ab808df 100644 --- a/primitives/offchain/src/lib.rs +++ b/primitives/offchain/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The Offchain Worker runtime api primitives. diff --git a/primitives/panic-handler/Cargo.toml b/primitives/panic-handler/Cargo.toml index b5adb9cb54..bc3ef2bdc6 100644 --- a/primitives/panic-handler/Cargo.toml +++ b/primitives/panic-handler/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-panic-handler" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Custom panic hook with bug report link" diff --git a/primitives/panic-handler/src/lib.rs b/primitives/panic-handler/src/lib.rs index c0f70d9d14..7b6787683e 100644 --- a/primitives/panic-handler/src/lib.rs +++ b/primitives/panic-handler/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Custom panic hook with bug report link //! diff --git a/primitives/phragmen/Cargo.toml b/primitives/phragmen/Cargo.toml index 29fc0ed41e..3317b2fac0 100644 --- a/primitives/phragmen/Cargo.toml +++ b/primitives/phragmen/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-phragmen" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Phragmen primitives" diff --git a/primitives/phragmen/benches/phragmen.rs b/primitives/phragmen/benches/phragmen.rs index e274586f60..c01d9f400d 100644 --- a/primitives/phragmen/benches/phragmen.rs +++ b/primitives/phragmen/benches/phragmen.rs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. + //! Benchmarks of the phragmen election algorithm. //! Note that execution times will not be accurate in an absolute scale, since //! - Everything is executed in the context of `TestExternalities` diff --git a/primitives/phragmen/compact/Cargo.toml b/primitives/phragmen/compact/Cargo.toml index 386116f268..1e5afd6c49 100644 --- a/primitives/phragmen/compact/Cargo.toml +++ b/primitives/phragmen/compact/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-phragmen-compact" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Phragmen Compact Solution" diff --git a/primitives/phragmen/compact/src/assignment.rs b/primitives/phragmen/compact/src/assignment.rs index 4630a494fc..a48cbd9379 100644 --- a/primitives/phragmen/compact/src/assignment.rs +++ b/primitives/phragmen/compact/src/assignment.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Code generation for the ratio assignment type. diff --git a/primitives/phragmen/compact/src/lib.rs b/primitives/phragmen/compact/src/lib.rs index 9406f944c3..cbd8596a59 100644 --- a/primitives/phragmen/compact/src/lib.rs +++ b/primitives/phragmen/compact/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Proc macro for phragmen compact assignment. diff --git a/primitives/phragmen/compact/src/staked.rs b/primitives/phragmen/compact/src/staked.rs index 81ccb5c559..cb16752195 100644 --- a/primitives/phragmen/compact/src/staked.rs +++ b/primitives/phragmen/compact/src/staked.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Code generation for the staked assignment type. diff --git a/primitives/phragmen/fuzzer/Cargo.toml b/primitives/phragmen/fuzzer/Cargo.toml index 7f7aef1961..d81d23c476 100644 --- a/primitives/phragmen/fuzzer/Cargo.toml +++ b/primitives/phragmen/fuzzer/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-phragmen-fuzzer" version = "2.0.0-alpha.5" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Fuzzer for phragmén implementation." diff --git a/primitives/phragmen/fuzzer/src/common.rs b/primitives/phragmen/fuzzer/src/common.rs index 3429dcb20a..f1aab214de 100644 --- a/primitives/phragmen/fuzzer/src/common.rs +++ b/primitives/phragmen/fuzzer/src/common.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Common fuzzing utils. diff --git a/primitives/phragmen/fuzzer/src/equalize.rs b/primitives/phragmen/fuzzer/src/equalize.rs index cb4f98c4eb..8ca417f269 100644 --- a/primitives/phragmen/fuzzer/src/equalize.rs +++ b/primitives/phragmen/fuzzer/src/equalize.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Fuzzing fro the equalize algorithm //! diff --git a/primitives/phragmen/fuzzer/src/reduce.rs b/primitives/phragmen/fuzzer/src/reduce.rs index f0a1646663..7ac15dd544 100644 --- a/primitives/phragmen/fuzzer/src/reduce.rs +++ b/primitives/phragmen/fuzzer/src/reduce.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Fuzzing for the reduce algorithm. //! diff --git a/primitives/phragmen/src/helpers.rs b/primitives/phragmen/src/helpers.rs index 6b1497e3ad..2674bc445d 100644 --- a/primitives/phragmen/src/helpers.rs +++ b/primitives/phragmen/src/helpers.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Helper methods for phragmen. diff --git a/primitives/phragmen/src/lib.rs b/primitives/phragmen/src/lib.rs index 9aaa96150f..03bbb279d8 100644 --- a/primitives/phragmen/src/lib.rs +++ b/primitives/phragmen/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Rust implementation of the Phragmén election algorithm. This is used in several pallets to //! optimally distribute the weight of a set of voters among an elected set of candidates. In the diff --git a/primitives/phragmen/src/mock.rs b/primitives/phragmen/src/mock.rs index cf9c90334b..fb80112515 100644 --- a/primitives/phragmen/src/mock.rs +++ b/primitives/phragmen/src/mock.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Mock file for phragmen. diff --git a/primitives/phragmen/src/node.rs b/primitives/phragmen/src/node.rs index 432c537052..d18c0e9016 100644 --- a/primitives/phragmen/src/node.rs +++ b/primitives/phragmen/src/node.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! (very) Basic implementation of a graph node used in the reduce algorithm. diff --git a/primitives/phragmen/src/reduce.rs b/primitives/phragmen/src/reduce.rs index 7153a9383c..2878aa78c4 100644 --- a/primitives/phragmen/src/reduce.rs +++ b/primitives/phragmen/src/reduce.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Rust implementation of the Phragmén reduce algorithm. This can be used by any off chain //! application to reduce cycles from the edge assignment, which will result in smaller size. diff --git a/primitives/phragmen/src/tests.rs b/primitives/phragmen/src/tests.rs index 720a0a3f75..c7b43e8a3c 100644 --- a/primitives/phragmen/src/tests.rs +++ b/primitives/phragmen/src/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for phragmen. diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index 740b429c0c..4c9dfb5d7b 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-rpc" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate RPC primitives and utilities." diff --git a/primitives/rpc/src/lib.rs b/primitives/rpc/src/lib.rs index 7c22daf5cd..c479f0df8b 100644 --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate RPC primitives and utilities. diff --git a/primitives/rpc/src/list.rs b/primitives/rpc/src/list.rs index 469eae3d14..a80d5a2227 100644 --- a/primitives/rpc/src/list.rs +++ b/primitives/rpc/src/list.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! RPC a lenient list or value type. diff --git a/primitives/rpc/src/number.rs b/primitives/rpc/src/number.rs index 1d41dd234f..63aa643fb6 100644 --- a/primitives/rpc/src/number.rs +++ b/primitives/rpc/src/number.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Chain RPC Block number type. diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index 1d0ae8f951..df1b32d73f 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-runtime-interface" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate runtime interface" diff --git a/primitives/runtime-interface/proc-macro/Cargo.toml b/primitives/runtime-interface/proc-macro/Cargo.toml index 28fe00cc39..429168fe7b 100644 --- a/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/primitives/runtime-interface/proc-macro/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-runtime-interface-proc-macro" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "This crate provides procedural macros for usage within the context of the Substrate runtime interface." diff --git a/primitives/runtime-interface/proc-macro/src/lib.rs b/primitives/runtime-interface/proc-macro/src/lib.rs index 2ed8b1a228..2f5b9de1c1 100644 --- a/primitives/runtime-interface/proc-macro/src/lib.rs +++ b/primitives/runtime-interface/proc-macro/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! This crate provides procedural macros for usage within the context of the Substrate runtime //! interface. diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs b/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs index 5e30870a82..5e51440938 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/codec.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Derive macro implementation of `PassBy` with the associated type set to `Codec`. //! diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs b/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs index 5d5b3ae43b..35ed9c0cb8 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/enum_.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Derive macro implementation of `PassBy` with the associated type set to `Enum`. //! diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs b/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs index 2e1caaa96c..cf3bb965d0 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/inner.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Derive macro implementation of `PassBy` with the associated type set to `Inner` and of the //! helper trait `PassByInner`. diff --git a/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs b/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs index 1466af598e..ff5ea4849a 100644 --- a/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs +++ b/primitives/runtime-interface/proc-macro/src/pass_by/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! All the `PassBy*` derive implementations. diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs index 8e83556f04..6760e96561 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/bare_function_interface.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generates the bare function interface for a given trait definition. //! diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs index 46de98c3c3..721eed649c 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/host_function_interface.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generates the extern host functions and the implementation for these host functions. //! diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs index 1c88198d6e..c9b6edf68f 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::utils::generate_runtime_interface_include; diff --git a/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs b/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs index 542c4ca4b8..70015d0242 100644 --- a/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs +++ b/primitives/runtime-interface/proc-macro/src/runtime_interface/trait_decl_impl.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Checks the trait declaration, makes the trait declaration module local, removes all method //! default implementations and implements the trait for `&mut dyn Externalities`. diff --git a/primitives/runtime-interface/src/host.rs b/primitives/runtime-interface/src/host.rs index cf03e6623a..4a01291e68 100644 --- a/primitives/runtime-interface/src/host.rs +++ b/primitives/runtime-interface/src/host.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Traits required by the runtime interface from the host side. diff --git a/primitives/runtime-interface/src/impls.rs b/primitives/runtime-interface/src/impls.rs index 084b5e11eb..217316c3dd 100644 --- a/primitives/runtime-interface/src/impls.rs +++ b/primitives/runtime-interface/src/impls.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Provides implementations for the runtime interface traits. diff --git a/primitives/runtime-interface/src/lib.rs b/primitives/runtime-interface/src/lib.rs index 4f748825e5..562f94b278 100644 --- a/primitives/runtime-interface/src/lib.rs +++ b/primitives/runtime-interface/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate runtime interface //! diff --git a/primitives/runtime-interface/src/pass_by.rs b/primitives/runtime-interface/src/pass_by.rs index d6767b5ebb..5ccb3a5e96 100644 --- a/primitives/runtime-interface/src/pass_by.rs +++ b/primitives/runtime-interface/src/pass_by.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Provides the [`PassBy`](PassBy) trait to simplify the implementation of the //! runtime interface traits for custom types. diff --git a/primitives/runtime-interface/src/util.rs b/primitives/runtime-interface/src/util.rs index fa7016a2b0..604e37e8be 100644 --- a/primitives/runtime-interface/src/util.rs +++ b/primitives/runtime-interface/src/util.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Various utilities that help interfacing with wasm runtime code. diff --git a/primitives/runtime-interface/src/wasm.rs b/primitives/runtime-interface/src/wasm.rs index a0801c2bfb..5511f60e30 100644 --- a/primitives/runtime-interface/src/wasm.rs +++ b/primitives/runtime-interface/src/wasm.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Traits required by the runtime interface from the wasm side. diff --git a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml index f992cad69b..5bf47afd78 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml +++ b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/primitives/runtime-interface/test-wasm-deprecated/build.rs b/primitives/runtime-interface/test-wasm-deprecated/build.rs index 647b476814..cd5db582f3 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/build.rs +++ b/primitives/runtime-interface/test-wasm-deprecated/build.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use wasm_builder_runner::WasmBuilder; diff --git a/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs b/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs index 29d28c75fa..ad005bfb5f 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs +++ b/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the runtime interface traits and proc macros. diff --git a/primitives/runtime-interface/test-wasm/Cargo.toml b/primitives/runtime-interface/test-wasm/Cargo.toml index f9e64a5027..5029d4fa3e 100644 --- a/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/primitives/runtime-interface/test-wasm/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/primitives/runtime-interface/test-wasm/build.rs b/primitives/runtime-interface/test-wasm/build.rs index 647b476814..cd5db582f3 100644 --- a/primitives/runtime-interface/test-wasm/build.rs +++ b/primitives/runtime-interface/test-wasm/build.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use wasm_builder_runner::WasmBuilder; diff --git a/primitives/runtime-interface/test-wasm/src/lib.rs b/primitives/runtime-interface/test-wasm/src/lib.rs index 700c77854a..90112046fc 100644 --- a/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/primitives/runtime-interface/test-wasm/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the runtime interface traits and proc macros. diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index 03f0122b22..3aab396e2e 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-runtime-interface-test" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" publish = false homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/runtime-interface/test/src/lib.rs b/primitives/runtime-interface/test/src/lib.rs index 57be4d03b1..06bc4e8ed8 100644 --- a/primitives/runtime-interface/test/src/lib.rs +++ b/primitives/runtime-interface/test/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Integration tests for runtime interface primitives #![cfg(test)] diff --git a/primitives/runtime-interface/tests/ui.rs b/primitives/runtime-interface/tests/ui.rs index 910771f938..2f7fd6d06b 100644 --- a/primitives/runtime-interface/tests/ui.rs +++ b/primitives/runtime-interface/tests/ui.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use std::env; diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index dcb0e22600..cc87a21f97 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-runtime" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Runtime Modules shared primitive types." diff --git a/primitives/runtime/src/curve.rs b/primitives/runtime/src/curve.rs index b00cbed652..be47b566e9 100644 --- a/primitives/runtime/src/curve.rs +++ b/primitives/runtime/src/curve.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Provides some utilities to define a piecewise linear function. diff --git a/primitives/runtime/src/generic/block.rs b/primitives/runtime/src/generic/block.rs index fb07d6c215..4a758b7416 100644 --- a/primitives/runtime/src/generic/block.rs +++ b/primitives/runtime/src/generic/block.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generic implementation of a block and associated items. diff --git a/primitives/runtime/src/generic/checked_extrinsic.rs b/primitives/runtime/src/generic/checked_extrinsic.rs index a329f334c0..5e4150cf2b 100644 --- a/primitives/runtime/src/generic/checked_extrinsic.rs +++ b/primitives/runtime/src/generic/checked_extrinsic.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generic implementation of an extrinsic that has passed the verification //! stage. diff --git a/primitives/runtime/src/generic/digest.rs b/primitives/runtime/src/generic/digest.rs index 44c1559aaa..ec0963e5ba 100644 --- a/primitives/runtime/src/generic/digest.rs +++ b/primitives/runtime/src/generic/digest.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generic implementation of a digest. diff --git a/primitives/runtime/src/generic/era.rs b/primitives/runtime/src/generic/era.rs index 37b4b495fe..9bfab517a9 100644 --- a/primitives/runtime/src/generic/era.rs +++ b/primitives/runtime/src/generic/era.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generic implementation of an unchecked (pre-verification) extrinsic. diff --git a/primitives/runtime/src/generic/header.rs b/primitives/runtime/src/generic/header.rs index 5efb36603d..24cceef2cd 100644 --- a/primitives/runtime/src/generic/header.rs +++ b/primitives/runtime/src/generic/header.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generic implementation of a block header. diff --git a/primitives/runtime/src/generic/mod.rs b/primitives/runtime/src/generic/mod.rs index 5e9928ba19..2a25c063ea 100644 --- a/primitives/runtime/src/generic/mod.rs +++ b/primitives/runtime/src/generic/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // tag::description[] //! Generic implementations of Extrinsic/Header/Block. diff --git a/primitives/runtime/src/generic/tests.rs b/primitives/runtime/src/generic/tests.rs index de2f4a19d9..56138094fa 100644 --- a/primitives/runtime/src/generic/tests.rs +++ b/primitives/runtime/src/generic/tests.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tests for the generic implementations of Extrinsic/Header/Block. diff --git a/primitives/runtime/src/generic/unchecked_extrinsic.rs b/primitives/runtime/src/generic/unchecked_extrinsic.rs index 4eb96ff960..41ff2609fc 100644 --- a/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Generic implementation of an unchecked (pre-verification) extrinsic. diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index b55edbd88d..41181ff439 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Runtime Modules shared primitive types. diff --git a/primitives/runtime/src/offchain/http.rs b/primitives/runtime/src/offchain/http.rs index bbc929526b..12a0fcf1e5 100644 --- a/primitives/runtime/src/offchain/http.rs +++ b/primitives/runtime/src/offchain/http.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A high-level helpers for making HTTP requests from Offchain Workers. //! diff --git a/primitives/runtime/src/offchain/mod.rs b/primitives/runtime/src/offchain/mod.rs index 9f0f949eae..427b54468f 100644 --- a/primitives/runtime/src/offchain/mod.rs +++ b/primitives/runtime/src/offchain/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A collection of higher lever helpers for offchain calls. diff --git a/primitives/runtime/src/offchain/storage.rs b/primitives/runtime/src/offchain/storage.rs index 681bc14451..f8dcd73fa2 100644 --- a/primitives/runtime/src/offchain/storage.rs +++ b/primitives/runtime/src/offchain/storage.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A set of storage helpers for offchain workers. diff --git a/primitives/runtime/src/random_number_generator.rs b/primitives/runtime/src/random_number_generator.rs index c3cd3dfb90..23d0421742 100644 --- a/primitives/runtime/src/random_number_generator.rs +++ b/primitives/runtime/src/random_number_generator.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! A simple pseudo random number generator that allows a stream of random numbers to be efficiently //! created from a single initial seed hash. diff --git a/primitives/runtime/src/runtime_string.rs b/primitives/runtime/src/runtime_string.rs index e7ee927e08..7fd38f48df 100644 --- a/primitives/runtime/src/runtime_string.rs +++ b/primitives/runtime/src/runtime_string.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Encode, Decode}; use sp_core::RuntimeDebug; diff --git a/primitives/runtime/src/testing.rs b/primitives/runtime/src/testing.rs index 333f78f515..2bb33ba6b5 100644 --- a/primitives/runtime/src/testing.rs +++ b/primitives/runtime/src/testing.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Testing utilities. diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 59c2ed64e0..345f3db76b 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitives for the runtime modules. diff --git a/primitives/runtime/src/transaction_validity.rs b/primitives/runtime/src/transaction_validity.rs index 852c0eea3d..fc2465a068 100644 --- a/primitives/runtime/src/transaction_validity.rs +++ b/primitives/runtime/src/transaction_validity.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Transaction validity interface. diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index a64854424e..73755d17c3 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-sandbox" version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "This crate provides means to instantiate and execute wasm modules." diff --git a/primitives/sandbox/src/lib.rs b/primitives/sandbox/src/lib.rs index 1ef30ca5db..a1348370df 100755 --- a/primitives/sandbox/src/lib.rs +++ b/primitives/sandbox/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! This crate provides means to instantiate and execute wasm modules. //! diff --git a/primitives/sandbox/with_std.rs b/primitives/sandbox/with_std.rs index cc3119003d..b5d6d89d04 100755 --- a/primitives/sandbox/with_std.rs +++ b/primitives/sandbox/with_std.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use sp_std::collections::btree_map::BTreeMap; use sp_std::fmt; diff --git a/primitives/sandbox/without_std.rs b/primitives/sandbox/without_std.rs index c31c6fe349..dfd3742c6e 100755 --- a/primitives/sandbox/without_std.rs +++ b/primitives/sandbox/without_std.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use codec::{Decode, Encode}; use sp_core::sandbox as sandbox_primitives; diff --git a/primitives/serializer/Cargo.toml b/primitives/serializer/Cargo.toml index 187c0e532f..ded058caa1 100644 --- a/primitives/serializer/Cargo.toml +++ b/primitives/serializer/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-serializer" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate customizable serde serializer." diff --git a/primitives/serializer/src/lib.rs b/primitives/serializer/src/lib.rs index 3138c3e63b..c1e03e58a7 100644 --- a/primitives/serializer/src/lib.rs +++ b/primitives/serializer/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate customizable serde serializer. //! diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index df20a3832c..f910d85440 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-session" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Primitives for sessions" diff --git a/primitives/session/src/lib.rs b/primitives/session/src/lib.rs index 74b4a250e6..477100687e 100644 --- a/primitives/session/src/lib.rs +++ b/primitives/session/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate core types around sessions. diff --git a/primitives/staking/Cargo.toml b/primitives/staking/Cargo.toml index 28907a75d3..f22e88855d 100644 --- a/primitives/staking/Cargo.toml +++ b/primitives/staking/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-staking" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "A crate which contains primitives that are useful for implementation that uses staking approaches in general. Definitions related to sessions, slashing, etc go here." diff --git a/primitives/staking/src/offence.rs b/primitives/staking/src/offence.rs index 5becfeab75..b250dc6c22 100644 --- a/primitives/staking/src/offence.rs +++ b/primitives/staking/src/offence.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Common traits and types that are useful for describing offences for usage in environments //! that use staking. diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 1d608ea6fc..470ad33fc3 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" documentation = "https://docs.rs/sp-state-machine" diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index d45e822be8..f689357eb9 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! State machine backends. These manage the code and storage of contracts. diff --git a/primitives/state-machine/src/basic.rs b/primitives/state-machine/src/basic.rs index 450b1b316e..7aa75cec70 100644 --- a/primitives/state-machine/src/basic.rs +++ b/primitives/state-machine/src/basic.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Basic implementation for Externalities. diff --git a/primitives/state-machine/src/changes_trie/build.rs b/primitives/state-machine/src/changes_trie/build.rs index 45535204e0..f8eabfce9b 100644 --- a/primitives/state-machine/src/changes_trie/build.rs +++ b/primitives/state-machine/src/changes_trie/build.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Structures and functions required to build changes trie for given block. diff --git a/primitives/state-machine/src/changes_trie/build_cache.rs b/primitives/state-machine/src/changes_trie/build_cache.rs index aebebf3a17..ef83966795 100644 --- a/primitives/state-machine/src/changes_trie/build_cache.rs +++ b/primitives/state-machine/src/changes_trie/build_cache.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Changes tries build cache. diff --git a/primitives/state-machine/src/changes_trie/build_iterator.rs b/primitives/state-machine/src/changes_trie/build_iterator.rs index bb93ce98a8..3bafd608ef 100644 --- a/primitives/state-machine/src/changes_trie/build_iterator.rs +++ b/primitives/state-machine/src/changes_trie/build_iterator.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Structures and functions to return blocks whose changes are to be included //! in given block's changes trie. diff --git a/primitives/state-machine/src/changes_trie/changes_iterator.rs b/primitives/state-machine/src/changes_trie/changes_iterator.rs index f5a936069b..f27493ee4b 100644 --- a/primitives/state-machine/src/changes_trie/changes_iterator.rs +++ b/primitives/state-machine/src/changes_trie/changes_iterator.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Functions + iterator that traverses changes tries and returns all //! (block, extrinsic) pairs where given key has been changed. diff --git a/primitives/state-machine/src/changes_trie/input.rs b/primitives/state-machine/src/changes_trie/input.rs index 4f0f3da40c..56971f7089 100644 --- a/primitives/state-machine/src/changes_trie/input.rs +++ b/primitives/state-machine/src/changes_trie/input.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Different types of changes trie input pairs. diff --git a/primitives/state-machine/src/changes_trie/mod.rs b/primitives/state-machine/src/changes_trie/mod.rs index ee6c6778e0..04322f1d59 100644 --- a/primitives/state-machine/src/changes_trie/mod.rs +++ b/primitives/state-machine/src/changes_trie/mod.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Changes trie related structures and functions. //! diff --git a/primitives/state-machine/src/changes_trie/prune.rs b/primitives/state-machine/src/changes_trie/prune.rs index 05555df305..54456f97ad 100644 --- a/primitives/state-machine/src/changes_trie/prune.rs +++ b/primitives/state-machine/src/changes_trie/prune.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Changes trie pruning-related functions. diff --git a/primitives/state-machine/src/changes_trie/storage.rs b/primitives/state-machine/src/changes_trie/storage.rs index 81651dd2e7..51b7ff6f50 100644 --- a/primitives/state-machine/src/changes_trie/storage.rs +++ b/primitives/state-machine/src/changes_trie/storage.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Changes trie storage utilities. diff --git a/primitives/state-machine/src/changes_trie/surface_iterator.rs b/primitives/state-machine/src/changes_trie/surface_iterator.rs index 02a7c277d9..b9c9d09f0f 100644 --- a/primitives/state-machine/src/changes_trie/surface_iterator.rs +++ b/primitives/state-machine/src/changes_trie/surface_iterator.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The best way to understand how this iterator works is to imagine some 2D terrain that have some mountains //! (digest changes tries) and valleys (changes tries for regular blocks). There are gems (blocks) beneath the diff --git a/primitives/state-machine/src/error.rs b/primitives/state-machine/src/error.rs index 464403c2f8..5468262f54 100644 --- a/primitives/state-machine/src/error.rs +++ b/primitives/state-machine/src/error.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. /// State Machine Errors diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 9d0eead69e..e4c619efe3 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Concrete externalities implementation. diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index a023f21d73..e9367cbec5 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate state machine implementation. diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index 3816bb732a..55d4e8db88 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The overlayed changes to state. diff --git a/primitives/state-machine/src/proving_backend.rs b/primitives/state-machine/src/proving_backend.rs index 1cb281b070..1d38d578a2 100644 --- a/primitives/state-machine/src/proving_backend.rs +++ b/primitives/state-machine/src/proving_backend.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Proving state machine backend. diff --git a/primitives/state-machine/src/stats.rs b/primitives/state-machine/src/stats.rs index 8fa03344ad..a8ca5a3b41 100644 --- a/primitives/state-machine/src/stats.rs +++ b/primitives/state-machine/src/stats.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Usage statistics for state db diff --git a/primitives/state-machine/src/testing.rs b/primitives/state-machine/src/testing.rs index 70ee1f77d2..47108b884a 100644 --- a/primitives/state-machine/src/testing.rs +++ b/primitives/state-machine/src/testing.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test implementation for Externalities. diff --git a/primitives/state-machine/src/trie_backend.rs b/primitives/state-machine/src/trie_backend.rs index c757f05f5d..3016647191 100644 --- a/primitives/state-machine/src/trie_backend.rs +++ b/primitives/state-machine/src/trie_backend.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Trie-based state machine backend. diff --git a/primitives/state-machine/src/trie_backend_essence.rs b/primitives/state-machine/src/trie_backend_essence.rs index 8f1b8c7a58..c0ec15c137 100644 --- a/primitives/state-machine/src/trie_backend_essence.rs +++ b/primitives/state-machine/src/trie_backend_essence.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Trie-based state machine backend essence used to read values //! from storage. diff --git a/primitives/std/Cargo.toml b/primitives/std/Cargo.toml index 2b58167f17..8f9d626e25 100644 --- a/primitives/std/Cargo.toml +++ b/primitives/std/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-std" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/primitives/std/src/lib.rs b/primitives/std/src/lib.rs index 856b095403..8ff1efc63d 100644 --- a/primitives/std/src/lib.rs +++ b/primitives/std/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Lowest-abstraction level for the Substrate runtime: just exports useful primitives from std //! or client/alloc to be used with any code that depends on the runtime. diff --git a/primitives/std/with_std.rs b/primitives/std/with_std.rs index 657d51dbf1..f495fa8fea 100644 --- a/primitives/std/with_std.rs +++ b/primitives/std/with_std.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub use std::alloc; pub use std::any; diff --git a/primitives/std/without_std.rs b/primitives/std/without_std.rs index 6b28f66b43..452994ca48 100755 --- a/primitives/std/without_std.rs +++ b/primitives/std/without_std.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. pub extern crate alloc; diff --git a/primitives/storage/Cargo.toml b/primitives/storage/Cargo.toml index 76174d13b0..a2ac2b1308 100644 --- a/primitives/storage/Cargo.toml +++ b/primitives/storage/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" description = "Storage related primitives" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" documentation = "https://docs.rs/sp-storage/" diff --git a/primitives/storage/src/lib.rs b/primitives/storage/src/lib.rs index c3e8d35075..073d80291c 100644 --- a/primitives/storage/src/lib.rs +++ b/primitives/storage/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Primitive types for storage related stuff. diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index 386f7be17c..b6d4972dd9 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-test-primitives" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/primitives/test-primitives/src/lib.rs b/primitives/test-primitives/src/lib.rs index 302b24fcc1..27c7ec5e10 100644 --- a/primitives/test-primitives/src/lib.rs +++ b/primitives/test-primitives/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The Substrate test primitives to share diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 9de079d1a7..4279538c24 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-timestamp" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate core types and inherents for timestamps." diff --git a/primitives/timestamp/src/lib.rs b/primitives/timestamp/src/lib.rs index f1fd06a44a..89bfcc20e0 100644 --- a/primitives/timestamp/src/lib.rs +++ b/primitives/timestamp/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate core types and inherents for timestamps. diff --git a/primitives/tracing/Cargo.toml b/primitives/tracing/Cargo.toml index 8eb3bc2bea..2bdf76bc06 100644 --- a/primitives/tracing/Cargo.toml +++ b/primitives/tracing/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "sp-tracing" version = "2.0.0-dev" -license = "GPL-3.0" +license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/primitives/tracing/src/lib.rs b/primitives/tracing/src/lib.rs index e5bc93cf9e..fa43f812d2 100644 --- a/primitives/tracing/src/lib.rs +++ b/primitives/tracing/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Substrate tracing primitives and macros. //! diff --git a/primitives/transaction-pool/Cargo.toml b/primitives/transaction-pool/Cargo.toml index b33687246f..5acb86ade4 100644 --- a/primitives/transaction-pool/Cargo.toml +++ b/primitives/transaction-pool/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-transaction-pool" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Transaction pool primitives types & Runtime API." diff --git a/primitives/transaction-pool/src/error.rs b/primitives/transaction-pool/src/error.rs index 1a456ca4fd..531b397cb9 100644 --- a/primitives/transaction-pool/src/error.rs +++ b/primitives/transaction-pool/src/error.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Transaction pool errors. diff --git a/primitives/transaction-pool/src/lib.rs b/primitives/transaction-pool/src/lib.rs index e4498bd024..b991c54152 100644 --- a/primitives/transaction-pool/src/lib.rs +++ b/primitives/transaction-pool/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Transaction pool primitives types & Runtime API. diff --git a/primitives/transaction-pool/src/pool.rs b/primitives/transaction-pool/src/pool.rs index ddc3fffa15..762ff06a9e 100644 --- a/primitives/transaction-pool/src/pool.rs +++ b/primitives/transaction-pool/src/pool.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Transaction pool primitives types & Runtime API. diff --git a/primitives/transaction-pool/src/runtime_api.rs b/primitives/transaction-pool/src/runtime_api.rs index fa2e51653b..9080c023f5 100644 --- a/primitives/transaction-pool/src/runtime_api.rs +++ b/primitives/transaction-pool/src/runtime_api.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tagged Transaction Queue Runtime API. diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index c010b3262d..b3cf58ec59 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/substrate/" -license = "GPL-3.0" +license = "Apache-2.0" edition = "2018" homepage = "https://substrate.dev" documentation = "https://docs.rs/sp-trie" diff --git a/primitives/utils/Cargo.toml b/primitives/utils/Cargo.toml index 79a3a33154..7ed50c9f32 100644 --- a/primitives/utils/Cargo.toml +++ b/primitives/utils/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-utils" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "I/O for Substrate runtimes" diff --git a/primitives/utils/src/lib.rs b/primitives/utils/src/lib.rs index 385a9b6689..644e94651d 100644 --- a/primitives/utils/src/lib.rs +++ b/primitives/utils/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Utilities Primitives for Substrate diff --git a/primitives/utils/src/metrics.rs b/primitives/utils/src/metrics.rs index 160714fdca..b991ce016b 100644 --- a/primitives/utils/src/metrics.rs +++ b/primitives/utils/src/metrics.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Metering primitives and globals diff --git a/primitives/utils/src/mpsc.rs b/primitives/utils/src/mpsc.rs index 42fb287c18..827195388f 100644 --- a/primitives/utils/src/mpsc.rs +++ b/primitives/utils/src/mpsc.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Features to meter unbounded channels diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index 1d492ee41c..dc9f562ccd 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-version" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Version module for the Substrate runtime; Provides a function that returns the runtime version." diff --git a/primitives/version/src/lib.rs b/primitives/version/src/lib.rs index 613b23156a..133d0497a2 100644 --- a/primitives/version/src/lib.rs +++ b/primitives/version/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Version module for the Substrate runtime; Provides a function that returns the runtime version. diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index 8bea87d490..d9d17b9edb 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -3,7 +3,7 @@ name = "sp-wasm-interface" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Types and traits for interfacing between the host and the wasm runtime." diff --git a/primitives/wasm-interface/src/lib.rs b/primitives/wasm-interface/src/lib.rs index 1601590e90..d3ca4ecb5e 100644 --- a/primitives/wasm-interface/src/lib.rs +++ b/primitives/wasm-interface/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Types and traits for interfacing between the host and the wasm runtime. diff --git a/primitives/wasm-interface/src/wasmi_impl.rs b/primitives/wasm-interface/src/wasmi_impl.rs index dea8519b71..5931671c97 100644 --- a/primitives/wasm-interface/src/wasmi_impl.rs +++ b/primitives/wasm-interface/src/wasmi_impl.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Implementation of conversions between Substrate and wasmi types. diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 43979be553..e19592a82b 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-test-utils" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index 37c99292ec..082d9941d8 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-test-client" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/test-utils/client/src/client_ext.rs b/test-utils/client/src/client_ext.rs index d663dda7a9..706a7b6e95 100644 --- a/test-utils/client/src/client_ext.rs +++ b/test-utils/client/src/client_ext.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Client extension for tests. diff --git a/test-utils/client/src/lib.rs b/test-utils/client/src/lib.rs index 22173ca04e..ffd93970f4 100644 --- a/test-utils/client/src/lib.rs +++ b/test-utils/client/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Client testing utilities. diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 00aa157529..6cd82ce029 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -4,7 +4,7 @@ version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/test-utils/runtime/build.rs b/test-utils/runtime/build.rs index 1fd3d52b2f..7d30dacfc8 100644 --- a/test-utils/runtime/build.rs +++ b/test-utils/runtime/build.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use wasm_builder_runner::WasmBuilder; diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index f622878404..32091a8e00 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-test-runtime-client" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/test-utils/runtime/client/src/block_builder_ext.rs b/test-utils/runtime/client/src/block_builder_ext.rs index 3a9f54d06c..cc0bbc69e8 100644 --- a/test-utils/runtime/client/src/block_builder_ext.rs +++ b/test-utils/runtime/client/src/block_builder_ext.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Block Builder extensions for tests. diff --git a/test-utils/runtime/client/src/lib.rs b/test-utils/runtime/client/src/lib.rs index 7b51d88e06..5b0eafb4a3 100644 --- a/test-utils/runtime/client/src/lib.rs +++ b/test-utils/runtime/client/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Client testing utilities. diff --git a/test-utils/runtime/client/src/trait_tests.rs b/test-utils/runtime/client/src/trait_tests.rs index 2a377fabba..537ff1197e 100644 --- a/test-utils/runtime/client/src/trait_tests.rs +++ b/test-utils/runtime/client/src/trait_tests.rs @@ -1,18 +1,19 @@ -// Copyright 2018-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2018-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! tests that should hold for all implementations of certain traits. //! to test implementations without duplication. diff --git a/test-utils/runtime/src/genesismap.rs b/test-utils/runtime/src/genesismap.rs index 9426cd6433..0b717fc5a9 100644 --- a/test-utils/runtime/src/genesismap.rs +++ b/test-utils/runtime/src/genesismap.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Tool for creating the genesis block. diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index c5c4a780f5..1acb59d0b7 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! The Substrate runtime. This can be compiled with #[no_std], ready for Wasm. diff --git a/test-utils/runtime/src/system.rs b/test-utils/runtime/src/system.rs index 9cfec187dd..3cbc416a40 100644 --- a/test-utils/runtime/src/system.rs +++ b/test-utils/runtime/src/system.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! System manager: Handles all of the top-level stuff; executing block/transaction, setting code //! and depositing logs. diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml index 9ccf9d2e44..3184527308 100644 --- a/test-utils/runtime/transaction-pool/Cargo.toml +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-test-runtime-transaction-pool" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" publish = false diff --git a/test-utils/runtime/transaction-pool/src/lib.rs b/test-utils/runtime/transaction-pool/src/lib.rs index 432c9e520d..c7778a51da 100644 --- a/test-utils/runtime/transaction-pool/src/lib.rs +++ b/test-utils/runtime/transaction-pool/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utils for the transaction pool together with the test runtime. //! diff --git a/test-utils/src/lib.rs b/test-utils/src/lib.rs index c1a18a1fa7..e600ab9fce 100644 --- a/test-utils/src/lib.rs +++ b/test-utils/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2017-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Test utils diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index beee4be5f8..ec37c8b139 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -4,7 +4,7 @@ version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" diff --git a/utils/browser/src/lib.rs b/utils/browser/src/lib.rs index 4281a23af1..408ba24cfe 100644 --- a/utils/browser/src/lib.rs +++ b/utils/browser/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use futures01::sync::mpsc as mpsc01; use log::{debug, info}; diff --git a/utils/build-script-utils/Cargo.toml b/utils/build-script-utils/Cargo.toml index 89c584808a..72374a531c 100644 --- a/utils/build-script-utils/Cargo.toml +++ b/utils/build-script-utils/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-build-script-utils" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Crate with utility functions for `build.rs` scripts." diff --git a/utils/build-script-utils/src/git.rs b/utils/build-script-utils/src/git.rs index 10f5446cb4..29c6a325fe 100644 --- a/utils/build-script-utils/src/git.rs +++ b/utils/build-script-utils/src/git.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use std::{env, fs, fs::File, io, io::Read, path::PathBuf}; diff --git a/utils/build-script-utils/src/lib.rs b/utils/build-script-utils/src/lib.rs index 57a1e7c5cd..512e6dcaef 100644 --- a/utils/build-script-utils/src/lib.rs +++ b/utils/build-script-utils/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Crate with utility functions for `build.rs` scripts. diff --git a/utils/build-script-utils/src/version.rs b/utils/build-script-utils/src/version.rs index 01a97c6f38..eefd331592 100644 --- a/utils/build-script-utils/src/version.rs +++ b/utils/build-script-utils/src/version.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use platforms::*; use std::{borrow::Cow, process::Command}; diff --git a/utils/fork-tree/Cargo.toml b/utils/fork-tree/Cargo.toml index c18826d16f..7062a61ae5 100644 --- a/utils/fork-tree/Cargo.toml +++ b/utils/fork-tree/Cargo.toml @@ -3,7 +3,7 @@ name = "fork-tree" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Utility library for managing tree-like ordered data with logic for pruning the tree while finalizing nodes." diff --git a/utils/fork-tree/src/lib.rs b/utils/fork-tree/src/lib.rs index be543e135f..e11c1138f4 100644 --- a/utils/fork-tree/src/lib.rs +++ b/utils/fork-tree/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Utility library for managing tree-like ordered data with logic for pruning //! the tree while finalizing nodes. diff --git a/utils/frame/benchmarking-cli/Cargo.toml b/utils/frame/benchmarking-cli/Cargo.toml index b02f42d759..fc681bd044 100644 --- a/utils/frame/benchmarking-cli/Cargo.toml +++ b/utils/frame/benchmarking-cli/Cargo.toml @@ -3,7 +3,7 @@ name = "frame-benchmarking-cli" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "CLI for benchmarking FRAME" diff --git a/utils/frame/benchmarking-cli/src/command.rs b/utils/frame/benchmarking-cli/src/command.rs index ebca380baf..ed63ec5e5d 100644 --- a/utils/frame/benchmarking-cli/src/command.rs +++ b/utils/frame/benchmarking-cli/src/command.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::BenchmarkCmd; use codec::{Decode, Encode}; diff --git a/utils/frame/benchmarking-cli/src/lib.rs b/utils/frame/benchmarking-cli/src/lib.rs index 96204d1ae5..7704f032b8 100644 --- a/utils/frame/benchmarking-cli/src/lib.rs +++ b/utils/frame/benchmarking-cli/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. mod command; diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index c635471bb9..b086f6aa5f 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-frame-rpc-support" version = "2.0.0-dev" authors = ["Parity Technologies ", "Andrew Dirksen "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "Substrate RPC for FRAME's support" diff --git a/utils/frame/rpc/support/src/lib.rs b/utils/frame/rpc/support/src/lib.rs index 118f5709a6..dc87d61852 100644 --- a/utils/frame/rpc/support/src/lib.rs +++ b/utils/frame/rpc/support/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! Combines [sc_rpc_api::state::StateClient] with [frame_support::storage::generator] traits //! to provide strongly typed chain state queries over rpc. diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 7d57e6b988..33fd3b399a 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -3,7 +3,7 @@ name = "substrate-frame-rpc-system" version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" description = "FRAME's system exposed over Substrate RPC" diff --git a/utils/frame/rpc/system/src/lib.rs b/utils/frame/rpc/system/src/lib.rs index 8dff3a641d..415f9541b6 100644 --- a/utils/frame/rpc/system/src/lib.rs +++ b/utils/frame/rpc/system/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! System FRAME specific RPC methods. diff --git a/utils/prometheus/Cargo.toml b/utils/prometheus/Cargo.toml index 0b46540903..9ecf5325cd 100644 --- a/utils/prometheus/Cargo.toml +++ b/utils/prometheus/Cargo.toml @@ -2,7 +2,7 @@ description = "Endpoint to expose Prometheus metrics" name = "substrate-prometheus-endpoint" version = "0.8.0-dev" -license = "GPL-3.0" +license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" homepage = "https://substrate.dev" diff --git a/utils/prometheus/src/networking.rs b/utils/prometheus/src/networking.rs index 5c8c036d44..92b9fedf6c 100644 --- a/utils/prometheus/src/networking.rs +++ b/utils/prometheus/src/networking.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use async_std::pin::Pin; use std::task::{Poll, Context}; diff --git a/utils/wasm-builder-runner/Cargo.toml b/utils/wasm-builder-runner/Cargo.toml index 75e55b35b4..346807d2e9 100644 --- a/utils/wasm-builder-runner/Cargo.toml +++ b/utils/wasm-builder-runner/Cargo.toml @@ -6,7 +6,7 @@ description = "Runner for substrate-wasm-builder" edition = "2018" readme = "README.md" repository = "https://github.com/paritytech/substrate/" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" [package.metadata.docs.rs] diff --git a/utils/wasm-builder-runner/src/lib.rs b/utils/wasm-builder-runner/src/lib.rs index cea7d38641..ae1a6e4968 100644 --- a/utils/wasm-builder-runner/src/lib.rs +++ b/utils/wasm-builder-runner/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # WASM builder runner //! diff --git a/utils/wasm-builder/Cargo.toml b/utils/wasm-builder/Cargo.toml index ca31cd1593..2b7a632b55 100644 --- a/utils/wasm-builder/Cargo.toml +++ b/utils/wasm-builder/Cargo.toml @@ -6,7 +6,7 @@ description = "Utility for building WASM binaries" edition = "2018" readme = "README.md" repository = "https://github.com/paritytech/substrate/" -license = "GPL-3.0" +license = "Apache-2.0" homepage = "https://substrate.dev" [package.metadata.docs.rs] diff --git a/utils/wasm-builder/src/lib.rs b/utils/wasm-builder/src/lib.rs index 8c80181bb8..9f9e77275a 100644 --- a/utils/wasm-builder/src/lib.rs +++ b/utils/wasm-builder/src/lib.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. //! # WASM builder is a utility for building a project as a WASM binary //! diff --git a/utils/wasm-builder/src/prerequisites.rs b/utils/wasm-builder/src/prerequisites.rs index da118a71f9..d7c1509576 100644 --- a/utils/wasm-builder/src/prerequisites.rs +++ b/utils/wasm-builder/src/prerequisites.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use std::fs; diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index 41e8694b85..d1c926c904 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -1,18 +1,19 @@ -// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. -// Substrate is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Substrate is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Substrate. If not, see . +// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. use crate::write_file_if_changed; -- GitLab From d84147099734c8df1f52d3b7707d4d589002e88a Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 15 May 2020 13:25:43 +0200 Subject: [PATCH 054/150] Democracy weight (#5828) --- Cargo.lock | 1 + bin/node/executor/tests/basic.rs | 147 ++--- bin/node/executor/tests/fees.rs | 33 +- bin/node/runtime/src/lib.rs | 2 + frame/democracy/Cargo.toml | 2 + frame/democracy/src/benchmarking.rs | 21 +- frame/democracy/src/lib.rs | 596 ++++++++++++++---- frame/democracy/src/tests.rs | 10 +- frame/democracy/src/tests/decoders.rs | 81 +++ frame/democracy/src/tests/migration.rs | 45 ++ frame/democracy/src/tests/preimage.rs | 12 +- frame/democracy/src/tests/public_proposals.rs | 32 +- 12 files changed, 742 insertions(+), 240 deletions(-) create mode 100644 frame/democracy/src/tests/decoders.rs create mode 100644 frame/democracy/src/tests/migration.rs diff --git a/Cargo.lock b/Cargo.lock index d7b0556bfd..f0bdcef29b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4148,6 +4148,7 @@ dependencies = [ "sp-runtime", "sp-std", "sp-storage", + "substrate-test-utils", ] [[package]] diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index a8eb1bfe3d..9350c3546f 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -21,12 +21,10 @@ use frame_support::{ traits::Currency, weights::{GetDispatchInfo, DispatchInfo, DispatchClass, constants::ExtrinsicBaseWeight}, }; -use sp_core::{ - NeverNativeValue, map, traits::Externalities, storage::{well_known_keys, Storage}, -}; +use sp_core::{NeverNativeValue, traits::Externalities, storage::well_known_keys}; use sp_runtime::{ ApplyExtrinsicResult, Fixed128, - traits::{Hash as HashT, Convert, BlakeTwo256}, + traits::{Hash as HashT, Convert}, transaction_validity::InvalidTransaction, }; use pallet_contracts::ContractAddressFor; @@ -159,20 +157,13 @@ fn block_with_size(time: u64, nonce: u32, size: usize) -> (Vec, Hash) { #[test] fn panic_execution_with_foreign_code_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (69u128, 0u8, 0u128, 0u128, 0u128).encode() - }, - >::hashed_key().to_vec() => { - 69_u128.encode() - }, - >::hashed_key_for(0) => { - vec![0u8; 32] - } - ], - children_default: map![], - }); + let mut t = new_test_ext(BLOATY_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (69u128, 0u8, 0u128, 0u128, 0u128).encode() + ); + t.insert(>::hashed_key().to_vec(), 69_u128.encode()); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let r = executor_call:: _>( &mut t, @@ -195,20 +186,13 @@ fn panic_execution_with_foreign_code_gives_error() { #[test] fn bad_extrinsic_with_native_equivalent_code_gives_error() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (0u32, 0u8, 69u128, 0u128, 0u128, 0u128).encode() - }, - >::hashed_key().to_vec() => { - 69_u128.encode() - }, - >::hashed_key_for(0) => { - vec![0u8; 32] - } - ], - children_default: map![], - }); + let mut t = new_test_ext(COMPACT_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (0u32, 0u8, 69u128, 0u128, 0u128, 0u128).encode() + ); + t.insert(>::hashed_key().to_vec(), 69_u128.encode()); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let r = executor_call:: _>( &mut t, @@ -231,18 +215,20 @@ fn bad_extrinsic_with_native_equivalent_code_gives_error() { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (0u32, 0u8, 111 * DOLLARS, 0u128, 0u128, 0u128).encode() - }, - >::hashed_key().to_vec() => { - (111 * DOLLARS).encode() - }, - >::hashed_key_for(0) => vec![0u8; 32] - ], - children_default: map![], - }); + let mut t = new_test_ext(COMPACT_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (0u32, 0u8, 111 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert( + >::hashed_key_for(bob()), + (0u32, 0u8, 0 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert( + >::hashed_key().to_vec(), + (111 * DOLLARS).encode() + ); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let r = executor_call:: _>( &mut t, @@ -273,18 +259,20 @@ fn successful_execution_with_native_equivalent_code_gives_ok() { #[test] fn successful_execution_with_foreign_code_gives_ok() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (0u32, 0u8, 111 * DOLLARS, 0u128, 0u128, 0u128).encode() - }, - >::hashed_key().to_vec() => { - (111 * DOLLARS).encode() - }, - >::hashed_key_for(0) => vec![0u8; 32] - ], - children_default: map![], - }); + let mut t = new_test_ext(BLOATY_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (0u32, 0u8, 111 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert( + >::hashed_key_for(bob()), + (0u32, 0u8, 0 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert( + >::hashed_key().to_vec(), + (111 * DOLLARS).encode() + ); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let r = executor_call:: _>( &mut t, @@ -708,15 +696,13 @@ fn native_big_block_import_fails_on_fallback() { #[test] fn panic_execution_gives_error() { - let mut t = TestExternalities::::new_with_code(BLOATY_CODE, Storage { - top: map![ - >::hashed_key().to_vec() => { - 0_u128.encode() - }, - >::hashed_key_for(0) => vec![0u8; 32] - ], - children_default: map![], - }); + let mut t = new_test_ext(BLOATY_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (0u32, 0u8, 0 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert(>::hashed_key().to_vec(), 0_u128.encode()); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let r = executor_call:: _>( &mut t, @@ -739,18 +725,20 @@ fn panic_execution_gives_error() { #[test] fn successful_execution_gives_ok() { - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (0u32, 0u8, 111 * DOLLARS, 0u128, 0u128, 0u128).encode() - }, - >::hashed_key().to_vec() => { - (111 * DOLLARS).encode() - }, - >::hashed_key_for(0) => vec![0u8; 32] - ], - children_default: map![], - }); + let mut t = new_test_ext(COMPACT_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (0u32, 0u8, 111 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert( + >::hashed_key_for(bob()), + (0u32, 0u8, 0 * DOLLARS, 0u128, 0u128, 0u128).encode() + ); + t.insert( + >::hashed_key().to_vec(), + (111 * DOLLARS).encode() + ); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let r = executor_call:: _>( &mut t, @@ -760,7 +748,12 @@ fn successful_execution_gives_ok() { None, ).0; assert!(r.is_ok()); + t.execute_with(|| { + assert_eq!(Balances::total_balance(&alice()), 111 * DOLLARS); + }); + let fm = t.execute_with(TransactionPayment::next_fee_multiplier); + let r = executor_call:: _>( &mut t, "BlockBuilder_apply_extrinsic", diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs index 77db2ca669..0e55f781e7 100644 --- a/bin/node/executor/tests/fees.rs +++ b/bin/node/executor/tests/fees.rs @@ -21,8 +21,8 @@ use frame_support::{ traits::Currency, weights::{GetDispatchInfo, constants::ExtrinsicBaseWeight}, }; -use sp_core::{NeverNativeValue, map, storage::Storage}; -use sp_runtime::{Fixed128, Perbill, traits::{Convert, BlakeTwo256}}; +use sp_core::NeverNativeValue; +use sp_runtime::{Fixed128, Perbill, traits::Convert}; use node_runtime::{ CheckedExtrinsic, Call, Runtime, Balances, TransactionPayment, TransactionByteFee, WeightFeeCoefficient, @@ -131,21 +131,20 @@ fn transaction_fee_is_correct_ultimate() { // - 1 MILLICENTS in substrate node. // - 1 milli-dot based on current polkadot runtime. // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) - let mut t = TestExternalities::::new_with_code(COMPACT_CODE, Storage { - top: map![ - >::hashed_key_for(alice()) => { - (0u32, 0u8, 100 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() - }, - >::hashed_key_for(bob()) => { - (0u32, 0u8, 10 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() - }, - >::hashed_key().to_vec() => { - (110 * DOLLARS).encode() - }, - >::hashed_key_for(0) => vec![0u8; 32] - ], - children_default: map![], - }); + let mut t = new_test_ext(COMPACT_CODE, false); + t.insert( + >::hashed_key_for(alice()), + (0u32, 0u8, 100 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() + ); + t.insert( + >::hashed_key_for(bob()), + (0u32, 0u8, 10 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS, 0 * DOLLARS).encode() + ); + t.insert( + >::hashed_key().to_vec(), + (110 * DOLLARS).encode() + ); + t.insert(>::hashed_key_for(0), vec![0u8; 32]); let tip = 1_000_000; let xt = sign(CheckedExtrinsic { diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index da99617f1c..32ba8c94db 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -344,6 +344,7 @@ parameter_types! { pub const CooloffPeriod: BlockNumber = 28 * 24 * 60 * MINUTES; // One cent: $10,000 / MB pub const PreimageByteDeposit: Balance = 1 * CENTS; + pub const MaxVotes: u32 = 100; } impl pallet_democracy::Trait for Runtime { @@ -376,6 +377,7 @@ impl pallet_democracy::Trait for Runtime { type PreimageByteDeposit = PreimageByteDeposit; type Slash = Treasury; type Scheduler = Scheduler; + type MaxVotes = MaxVotes; } parameter_types! { diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 9183b48f37..5c339d2bc5 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -26,6 +26,7 @@ sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } pallet-balances = { version = "2.0.0-dev", path = "../balances" } pallet-scheduler = { version = "2.0.0-dev", path = "../scheduler" } sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } hex-literal = "0.2.1" [features] @@ -43,5 +44,6 @@ std = [ runtime-benchmarks = [ "frame-benchmarking", "frame-system/runtime-benchmarks", + "frame-support/runtime-benchmarks", "sp-runtime/runtime-benchmarks", ] diff --git a/frame/democracy/src/benchmarking.rs b/frame/democracy/src/benchmarking.rs index b60250a5a6..9fa619a994 100644 --- a/frame/democracy/src/benchmarking.rs +++ b/frame/democracy/src/benchmarking.rs @@ -34,7 +34,6 @@ const MAX_USERS: u32 = 1000; const MAX_REFERENDUMS: u32 = 100; const MAX_PROPOSALS: u32 = 100; const MAX_SECONDERS: u32 = 100; -const MAX_VETOERS: u32 = 100; const MAX_BYTES: u32 = 16_384; fn assert_last_event(generic_event: ::Event) { @@ -56,7 +55,11 @@ fn add_proposal(n: u32) -> Result { let value = T::MinimumDeposit::get(); let proposal_hash: T::Hash = T::Hashing::hash_of(&n); - Democracy::::propose(RawOrigin::Signed(other).into(), proposal_hash, value.into())?; + Democracy::::propose( + RawOrigin::Signed(other).into(), + proposal_hash, + value.into(), + )?; Ok(proposal_hash) } @@ -134,15 +137,15 @@ benchmarks! { // Create s existing "seconds" for i in 0 .. s { let seconder = funded_account::("seconder", i); - Democracy::::second(RawOrigin::Signed(seconder).into(), 0)?; + Democracy::::second(RawOrigin::Signed(seconder).into(), 0, u32::max_value())?; } let deposits = Democracy::::deposit_of(0).ok_or("Proposal not created")?; - assert_eq!(deposits.1.len(), (s + 1) as usize, "Seconds not recorded"); - }: _(RawOrigin::Signed(caller), 0) + assert_eq!(deposits.0.len(), (s + 1) as usize, "Seconds not recorded"); + }: _(RawOrigin::Signed(caller), 0, u32::max_value()) verify { let deposits = Democracy::::deposit_of(0).ok_or("Proposal not created")?; - assert_eq!(deposits.1.len(), (s + 2) as usize, "`second` benchmark did not work"); + assert_eq!(deposits.0.len(), (s + 2) as usize, "`second` benchmark did not work"); } vote_new { @@ -300,7 +303,7 @@ benchmarks! { // Worst case scenario, we external propose a previously blacklisted proposal external_propose { let p in 1 .. MAX_PROPOSALS; - let v in 1 .. MAX_VETOERS; + let v in 1 .. MAX_VETOERS as u32; let origin = T::ExternalOrigin::successful_origin(); let proposal_hash = T::Hashing::hash_of(&p); @@ -361,7 +364,7 @@ benchmarks! { veto_external { // Existing veto-ers - let v in 0 .. MAX_VETOERS; + let v in 0 .. MAX_VETOERS as u32; let proposal_hash: T::Hash = T::Hashing::hash_of(&v); @@ -685,7 +688,7 @@ benchmarks! { assert!(Preimages::::contains_key(proposal_hash)); let caller = funded_account::("caller", 0); - }: _(RawOrigin::Signed(caller), proposal_hash.clone()) + }: _(RawOrigin::Signed(caller), proposal_hash.clone(), u32::max_value()) verify { let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); assert!(!Preimages::::contains_key(proposal_hash)); diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 1cf89f84c5..e0f1ec9b5c 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -169,14 +169,16 @@ use sp_runtime::{ DispatchResult, DispatchError, RuntimeDebug, traits::{Zero, Hash, Dispatchable, Saturating}, }; -use codec::{Encode, Decode}; +use codec::{Encode, Decode, Input}; use frame_support::{ decl_module, decl_storage, decl_event, decl_error, ensure, Parameter, + storage::IterableStorageMap, weights::{Weight, DispatchClass}, traits::{ Currency, ReservableCurrency, LockableCurrency, WithdrawReason, LockIdentifier, Get, OnUnbalanced, BalanceStatus, schedule::Named as ScheduleNamed, EnsureOrigin - } + }, + dispatch::DispatchResultWithPostInfo, }; use frame_system::{self as system, ensure_signed, ensure_root}; @@ -197,6 +199,11 @@ pub mod benchmarking; const DEMOCRACY_ID: LockIdentifier = *b"democrac"; +/// The maximum number of vetoers on a single proposal used to compute Weight. +/// +/// NOTE: This is not enforced by any logic. +pub const MAX_VETOERS: Weight = 100; + /// A proposal index. pub type PropIndex = u32; @@ -265,6 +272,11 @@ pub trait Trait: frame_system::Trait + Sized { type CancellationOrigin: EnsureOrigin; /// Origin for anyone able to veto proposals. + /// + /// # Warning + /// + /// The number of Vetoers for a proposal must be small, extrinsics are weighted according to + /// [MAX_VETOERS](./const.MAX_VETOERS.html) type VetoOrigin: EnsureOrigin; /// Period in blocks where an external proposal may not be re-submitted after being vetoed. @@ -278,6 +290,12 @@ pub trait Trait: frame_system::Trait + Sized { /// The Scheduler. type Scheduler: ScheduleNamed; + + /// The maximum number of votes for an account. + /// + /// Also used to compute weight, an overly big value can + /// lead to extrinsic with very big weight: see `delegate` for instance. + type MaxVotes: Get; } #[derive(Clone, Encode, Decode, RuntimeDebug)] @@ -304,6 +322,14 @@ impl PreimageStatus as Democracy { // TODO: Refactor public proposal queue into its own pallet. @@ -314,7 +340,7 @@ decl_storage! { pub PublicProps get(fn public_props): Vec<(PropIndex, T::Hash, T::AccountId)>; /// Those who have locked a deposit. pub DepositOf get(fn deposit_of): - map hasher(twox_64_concat) PropIndex => Option<(BalanceOf, Vec)>; + map hasher(twox_64_concat) PropIndex => Option<(Vec, BalanceOf)>; /// Map of hashes to the proposal preimage, along with who registered it and their deposit. /// The block number is the block at which it was deposited. @@ -368,6 +394,11 @@ decl_storage! { /// Record of all proposals that have been subject to emergency cancellation. pub Cancellations: map hasher(identity) T::Hash => bool; + + /// Storage version of the pallet. + /// + /// New networks start with last version. + StorageVersion build(|_| Some(Releases::V1)): Option; } } @@ -492,6 +523,62 @@ decl_error! { InstantNotAllowed, /// Delegation to oneself makes no sense. Nonsense, + /// Invalid upper bound. + WrongUpperBound, + /// Maximum number of votes reached. + MaxVotesReached, + } +} + +/// Functions for calcuating the weight of some dispatchables. +mod weight_for { + use frame_support::{traits::Get, weights::Weight}; + use super::Trait; + + /// Calculate the weight for `delegate`. + /// - Db reads: 2*`VotingOf`, `balances locks` + /// - Db writes: 2*`VotingOf`, `balances locks` + /// - Db reads per votes: `ReferendumInfoOf` + /// - Db writes per votes: `ReferendumInfoOf` + /// - Base Weight: 65.78 + 8.229 * R µs + // NOTE: weight must cover an incorrect voting of origin with 100 votes. + pub(crate) fn delegate(votes: Weight) -> Weight { + T::DbWeight::get().reads_writes(votes.saturating_add(3), votes.saturating_add(3)) + .saturating_add(66_000_000) + .saturating_add(votes.saturating_mul(8_100_000)) + } + + /// Calculate the weight for `undelegate`. + /// - Db reads: 2*`VotingOf` + /// - Db writes: 2*`VotingOf` + /// - Db reads per votes: `ReferendumInfoOf` + /// - Db writes per votes: `ReferendumInfoOf` + /// - Base Weight: 33.29 + 8.104 * R µs + pub(crate) fn undelegate(votes: Weight) -> Weight { + T::DbWeight::get().reads_writes(votes.saturating_add(2), votes.saturating_add(2)) + .saturating_add(33_000_000) + .saturating_add(votes.saturating_mul(8_000_000)) + } + + /// Calculate the weight for `proxy_delegate`. + /// same as `delegate with additional: + /// - Db reads: `Proxy`, `proxy account` + /// - Db writes: `proxy account` + /// - Base Weight: 68.61 + 8.039 * R µs + pub(crate) fn proxy_delegate(votes: Weight) -> Weight { + T::DbWeight::get().reads_writes(votes.saturating_add(5), votes.saturating_add(4)) + .saturating_add(69_000_000) + .saturating_add(votes.saturating_mul(8_000_000)) + } + + /// Calculate the weight for `proxy_undelegate`. + /// same as `undelegate with additional: + /// Db reads: `Proxy` + /// Base Weight: 39 + 7.958 * R µs + pub(crate) fn proxy_undelegate(votes: Weight) -> Weight { + T::DbWeight::get().reads_writes(votes.saturating_add(3), votes.saturating_add(2)) + .saturating_add(40_000_000) + .saturating_add(votes.saturating_mul(8_000_000)) } } @@ -526,6 +613,22 @@ decl_module! { fn deposit_event() = default; + fn on_runtime_upgrade() -> Weight { + if let None = StorageVersion::get() { + StorageVersion::put(Releases::V1); + + DepositOf::::translate::< + (BalanceOf, Vec), _ + >(|_, (balance, accounts)| { + Some((accounts, balance)) + }); + + T::MaximumBlockWeight::get() + } else { + T::DbWeight::get().reads(1) + } + } + /// Propose a sensitive action to be taken. /// /// The dispatch origin of this call must be _Signed_ and the sender must @@ -537,22 +640,22 @@ decl_module! { /// Emits `Proposed`. /// /// # - /// - `O(P)` - /// - P is the number proposals in the `PublicProps` vec. - /// - Two DB changes, one DB entry. + /// - Complexity: `O(1)` + /// - Db reads: `PublicPropCount`, `PublicProps` + /// - Db writes: `PublicPropCount`, `PublicProps`, `DepositOf` + /// ------------------- + /// Base Weight: 42.58 + .127 * P µs with `P` the number of proposals `PublicProps` /// # - #[weight = 5_000_000_000] - fn propose(origin, - proposal_hash: T::Hash, - #[compact] value: BalanceOf - ) { + #[weight = 50_000_000 + T::DbWeight::get().reads_writes(2, 3)] + fn propose(origin, proposal_hash: T::Hash, #[compact] value: BalanceOf) { let who = ensure_signed(origin)?; ensure!(value >= T::MinimumDeposit::get(), Error::::ValueLow); + T::Currency::reserve(&who, value)?; let index = Self::public_prop_count(); PublicPropCount::put(index + 1); - >::insert(index, (value, &[&who][..])); + >::insert(index, (&[&who][..], value)); >::append((index, proposal_hash, who)); @@ -565,19 +668,30 @@ decl_module! { /// must have funds to cover the deposit, equal to the original deposit. /// /// - `proposal`: The index of the proposal to second. + /// - `seconds_upper_bound`: an upper bound on the current number of seconds on this + /// proposal. Extrinsic is weighted according to this value with no refund. /// /// # - /// - `O(S)`. - /// - S is the number of seconds a proposal already has. - /// - One DB entry. + /// - Complexity: `O(S)` where S is the number of seconds a proposal already has. + /// - Db reads: `DepositOf` + /// - Db writes: `DepositOf` + /// --------- + /// - Base Weight: 22.28 + .229 * S µs /// # - #[weight = 5_000_000_000] - fn second(origin, #[compact] proposal: PropIndex) { + #[weight = 23_000_000 + .saturating_add(230_000.saturating_mul(Weight::from(*seconds_upper_bound))) + .saturating_add(T::DbWeight::get().reads_writes(1, 1)) + ] + fn second(origin, #[compact] proposal: PropIndex, #[compact] seconds_upper_bound: u32) { let who = ensure_signed(origin)?; + + let seconds = Self::len_of_deposit_of(proposal) + .ok_or_else(|| Error::::ProposalMissing)?; + ensure!(seconds <= seconds_upper_bound, Error::::WrongUpperBound); let mut deposit = Self::deposit_of(proposal) .ok_or(Error::::ProposalMissing)?; - T::Currency::reserve(&who, deposit.0)?; - deposit.1.push(who); + T::Currency::reserve(&who, deposit.1)?; + deposit.0.push(who); >::insert(proposal, deposit); } @@ -590,11 +704,16 @@ decl_module! { /// - `vote`: The vote configuration. /// /// # - /// - `O(R)`. - /// - R is the number of referendums the voter has voted on. - /// - One DB change, one DB entry. + /// - Complexity: `O(R)` where R is the number of referendums the voter has voted on. + /// weight is charged as if maximum votes. + /// - Db reads: `ReferendumInfoOf`, `VotingOf`, `balances locks` + /// - Db writes: `ReferendumInfoOf`, `VotingOf`, `balances locks` + /// -------------------- + /// - Base Weight: + /// - Vote New: 49.24 + .333 * R µs + /// - Vote Existing: 49.94 + .343 * R µs /// # - #[weight = 200_000_000] + #[weight = 50_000_000 + 350_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(3, 3)] fn vote(origin, #[compact] ref_index: ReferendumIndex, vote: AccountVote>, @@ -612,10 +731,16 @@ decl_module! { /// - `vote`: The vote configuration. /// /// # - /// - `O(1)`. - /// - One DB change, one DB entry. + /// - Complexity: `O(R)` where R is the number of referendums the proxy has voted on. + /// weight is charged as if maximum votes. + /// - Db reads: `ReferendumInfoOf`, `VotingOf`, `balances locks`, `Proxy`, `proxy account` + /// - Db writes: `ReferendumInfoOf`, `VotingOf`, `balances locks` + /// ------------ + /// - Base Weight: + /// - Proxy Vote New: 54.35 + .344 * R µs + /// - Proxy Vote Existing: 54.35 + .35 * R µs /// # - #[weight = 200_000_000] + #[weight = 55_000_000 + 350_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(5, 3)] fn proxy_vote(origin, #[compact] ref_index: ReferendumIndex, vote: AccountVote>, @@ -633,9 +758,13 @@ decl_module! { /// -`ref_index`: The index of the referendum to cancel. /// /// # - /// - `O(1)`. + /// - Complexity: `O(1)`. + /// - Db reads: `ReferendumInfoOf`, `Cancellations` + /// - Db writes: `ReferendumInfoOf`, `Cancellations` + /// ------------- + /// - Base Weight: 34.25 µs /// # - #[weight = (500_000_000, DispatchClass::Operational)] + #[weight = (35_000_000 + T::DbWeight::get().reads_writes(2, 2), DispatchClass::Operational)] fn emergency_cancel(origin, ref_index: ReferendumIndex) { T::CancellationOrigin::ensure_origin(origin)?; @@ -655,10 +784,13 @@ decl_module! { /// - `proposal_hash`: The preimage hash of the proposal. /// /// # - /// - `O(1)`. - /// - One DB change. + /// - Complexity `O(V)` with V number of vetoers in the blacklist of proposal. + /// Decoding vec of length V. Charged as maximum + /// - Db reads: `NextExternal`, `Blacklist` + /// - Db writes: `NextExternal` + /// - Base Weight: 13.8 + .106 * V µs /// # - #[weight = 5_000_000_000] + #[weight = 15_000_000 + 110_000 * MAX_VETOERS + T::DbWeight::get().reads_writes(2, 1)] fn external_propose(origin, proposal_hash: T::Hash) { T::ExternalOrigin::ensure_origin(origin)?; ensure!(!>::exists(), Error::::DuplicateProposal); @@ -682,10 +814,11 @@ decl_module! { /// pre-scheduled `external_propose` call. /// /// # - /// - `O(1)`. - /// - One DB change. + /// - Complexity: `O(1)` + /// - Db write: `NextExternal` + /// - Base Weight: 3.065 µs /// # - #[weight = 5_000_000_000] + #[weight = 3_100_000 + T::DbWeight::get().writes(1)] fn external_propose_majority(origin, proposal_hash: T::Hash) { T::ExternalMajorityOrigin::ensure_origin(origin)?; >::put((proposal_hash, VoteThreshold::SimpleMajority)); @@ -702,10 +835,11 @@ decl_module! { /// pre-scheduled `external_propose` call. /// /// # - /// - `O(1)`. - /// - One DB change. + /// - Complexity: `O(1)` + /// - Db write: `NextExternal` + /// - Base Weight: 3.087 µs /// # - #[weight = 5_000_000_000] + #[weight = 3_100_000 + T::DbWeight::get().writes(1)] fn external_propose_default(origin, proposal_hash: T::Hash) { T::ExternalDefaultOrigin::ensure_origin(origin)?; >::put((proposal_hash, VoteThreshold::SuperMajorityAgainst)); @@ -726,11 +860,12 @@ decl_module! { /// Emits `Started`. /// /// # - /// - One DB clear. - /// - One DB change. - /// - One extra DB entry. + /// - Complexity: `O(1)` + /// - Db reads: `NextExternal`, `ReferendumCount` + /// - Db writes: `NextExternal`, `ReferendumCount`, `ReferendumInfoOf` + /// - Base Weight: 30.1 µs /// # - #[weight = 200_000_000] + #[weight = 30_000_000 + T::DbWeight::get().reads_writes(2, 3)] fn fast_track(origin, proposal_hash: T::Hash, voting_period: T::BlockNumber, @@ -775,13 +910,13 @@ decl_module! { /// Emits `Vetoed`. /// /// # - /// - Two DB entries. - /// - One DB clear. - /// - Performs a binary search on `existing_vetoers` which should not - /// be very large. - /// - O(log v), v is number of `existing_vetoers` + /// - Complexity: `O(V + log(V))` where V is number of `existing vetoers` + /// Performs a binary search on `existing_vetoers` which should not be very large. + /// - Db reads: `NextExternal`, `Blacklist` + /// - Db writes: `NextExternal`, `Blacklist` + /// - Base Weight: 29.87 + .188 * V µs /// # - #[weight = 200_000_000] + #[weight = 30_000_000 + 180_000 * MAX_VETOERS + T::DbWeight::get().reads_writes(2, 2)] fn veto_external(origin, proposal_hash: T::Hash) { let who = T::VetoOrigin::ensure_origin(origin)?; @@ -812,9 +947,11 @@ decl_module! { /// - `ref_index`: The index of the referendum to cancel. /// /// # - /// - `O(1)`. + /// - Complexity: `O(1)`. + /// - Db writes: `ReferendumInfoOf` + /// - Base Weight: 21.57 µs /// # - #[weight = (0, DispatchClass::Operational)] + #[weight = (22_000_000 + T::DbWeight::get().writes(1), DispatchClass::Operational)] fn cancel_referendum(origin, #[compact] ref_index: ReferendumIndex) { ensure_root(origin)?; Self::internal_cancel_referendum(ref_index); @@ -827,22 +964,24 @@ decl_module! { /// - `which`: The index of the referendum to cancel. /// /// # - /// - One DB change. - /// - O(d) where d is the items in the dispatch queue. + /// - `O(D)` where `D` is the items in the dispatch queue. Weighted as `D = 10`. + /// - Db reads: `scheduler lookup`, scheduler agenda` + /// - Db writes: `scheduler lookup`, scheduler agenda` + /// - Base Weight: 36.78 + 3.277 * D µs /// # - #[weight = (0, DispatchClass::Operational)] + #[weight = (68_000_000 + T::DbWeight::get().reads_writes(2, 2), DispatchClass::Operational)] fn cancel_queued(origin, which: ReferendumIndex) { ensure_root(origin)?; T::Scheduler::cancel_named((DEMOCRACY_ID, which).encode()) .map_err(|_| Error::::ProposalMissing)?; } + /// Weight: see `begin_block` fn on_initialize(n: T::BlockNumber) -> Weight { - if let Err(e) = Self::begin_block(n) { + Self::begin_block(n).unwrap_or_else(|e| { sp_runtime::print(e); - } - - 0 + 0 + }) } /// Specify a proxy that is already open to us. Called by the stash. @@ -854,9 +993,12 @@ decl_module! { /// - `proxy`: The account that will be activated as proxy. /// /// # - /// - One extra DB entry. + /// - Complexity: `O(1)` + /// - Db reads: `Proxy` + /// - Db writes: `Proxy` + /// - Base Weight: 7.972 µs /// # - #[weight = 100_000_000] + #[weight = 8_000_000 + T::DbWeight::get().reads_writes(1, 1)] fn activate_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; Proxy::::try_mutate(&proxy, |a| match a.take() { @@ -877,9 +1019,12 @@ decl_module! { /// The dispatch origin of this call must be _Signed_. /// /// # - /// - One DB clear. + /// - Complexity: `O(1)` + /// - Db reads: `Proxy`, `sender account` + /// - Db writes: `Proxy`, `sender account` + /// - Base Weight: 15.41 µs /// # - #[weight = 100_000_000] + #[weight = 16_000_000 + T::DbWeight::get().reads_writes(1, 1)] fn close_proxy(origin) { let who = ensure_signed(origin)?; Proxy::::mutate(&who, |a| { @@ -901,9 +1046,12 @@ decl_module! { /// - `proxy`: The account that will be deactivated as proxy. /// /// # - /// - One DB clear. + /// - Complexity: `O(1)` + /// - Db reads: `Proxy` + /// - Db writes: `Proxy` + /// - Base Weight: 8.03 µs /// # - #[weight = 100_000_000] + #[weight = 8_000_000 + T::DbWeight::get().reads_writes(1, 1)] fn deactivate_proxy(origin, proxy: T::AccountId) { let who = ensure_signed(origin)?; Proxy::::try_mutate(&proxy, |a| match a.take() { @@ -935,11 +1083,26 @@ decl_module! { /// Emits `Delegated`. /// /// # + /// - Complexity: `O(R)` where R is the number of referendums the voter delegating to has + /// voted on. Weight is charged as if maximum votes. + /// - Db reads: 2*`VotingOf`, `balances locks` + /// - Db writes: 2*`VotingOf`, `balances locks` + /// - Db reads per votes: `ReferendumInfoOf` + /// - Db writes per votes: `ReferendumInfoOf` + /// - Base Weight: 65.78 + 8.229 * R µs + // NOTE: weight must cover an incorrect voting of origin with 100 votes. /// # - #[weight = 500_000_000] - pub fn delegate(origin, to: T::AccountId, conviction: Conviction, balance: BalanceOf) { + #[weight = weight_for::delegate::(T::MaxVotes::get().into())] + pub fn delegate( + origin, + to: T::AccountId, + conviction: Conviction, + balance: BalanceOf + ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - Self::try_delegate(who, to, conviction, balance)?; + let votes = Self::try_delegate(who, to, conviction, balance)?; + + Ok(Some(weight_for::delegate::(votes.into())).into()) } /// Undelegate the voting power of the sending account. @@ -953,12 +1116,20 @@ decl_module! { /// Emits `Undelegated`. /// /// # - /// - O(1). + /// - Complexity: `O(R)` where R is the number of referendums the voter delegating to has + /// voted on. Weight is charged as if maximum votes. + /// - Db reads: 2*`VotingOf` + /// - Db writes: 2*`VotingOf` + /// - Db reads per votes: `ReferendumInfoOf` + /// - Db writes per votes: `ReferendumInfoOf` + /// - Base Weight: 33.29 + 8.104 * R µs + // NOTE: weight must cover an incorrect voting of origin with 100 votes. /// # - #[weight = 500_000_000] - fn undelegate(origin) { + #[weight = weight_for::undelegate::(T::MaxVotes::get().into())] + fn undelegate(origin) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - Self::try_undelegate(who)?; + let votes = Self::try_undelegate(who)?; + Ok(Some(weight_for::undelegate::(votes.into())).into()) } /// Clears all public proposals. @@ -967,12 +1138,12 @@ decl_module! { /// /// # /// - `O(1)`. - /// - One DB clear. + /// - Db writes: `PublicProps` + /// - Base Weight: 2.505 µs /// # - #[weight = 0] + #[weight = 2_500_000 + T::DbWeight::get().writes(1)] fn clear_public_proposals(origin) { ensure_root(origin)?; - >::kill(); } @@ -986,10 +1157,13 @@ decl_module! { /// Emits `PreimageNoted`. /// /// # - /// - Dependent on the size of `encoded_proposal` but protected by a - /// required deposit. + /// - Complexity: `O(E)` with E size of `encoded_proposal` (protected by a required deposit). + /// - Db reads: `Preimages` + /// - Db writes: `Preimages` + /// - Base Weight: 37.93 + .004 * b µs /// # - #[weight = 100_000_000] + #[weight = 38_000_000 + 4_000 * Weight::from(encoded_proposal.len() as u32) + + T::DbWeight::get().reads_writes(1, 1)] fn note_preimage(origin, encoded_proposal: Vec) { let who = ensure_signed(origin)?; let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); @@ -1022,12 +1196,17 @@ decl_module! { /// Emits `PreimageNoted`. /// /// # - /// - Dependent on the size of `encoded_proposal` and length of dispatch queue. + /// - Complexity: `O(E)` with E size of `encoded_proposal` (protected by a required deposit). + /// - Db reads: `Preimages` + /// - Db writes: `Preimages` + /// - Base Weight: 28.04 + .003 * b µs /// # - #[weight = 100_000_000] + #[weight = 28_000_000 + 3_000 * Weight::from(encoded_proposal.len() as u32) + + T::DbWeight::get().reads_writes(1, 1)] fn note_imminent_preimage(origin, encoded_proposal: Vec) { let who = ensure_signed(origin)?; let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); + Self::check_pre_image_is_missing(proposal_hash)?; let status = Preimages::::get(&proposal_hash).ok_or(Error::::NotImminent)?; let expiry = status.to_missing_expiry().ok_or(Error::::DuplicatePreimage)?; @@ -1050,6 +1229,8 @@ decl_module! { /// The dispatch origin of this call must be _Signed_. /// /// - `proposal_hash`: The preimage hash of a proposal. + /// - `proposal_length_upper_bound`: an upper bound on length of the proposal. + /// Extrinsic is weighted according to this value with no refund. /// /// This will only work after `VotingPeriod` blocks from the time that the preimage was /// noted, if it's the same account doing it. If it's a different account, then it'll only @@ -1058,11 +1239,21 @@ decl_module! { /// Emits `PreimageReaped`. /// /// # - /// - One DB clear. + /// - Complexity: `O(D)` where D is length of proposal. + /// - Db reads: `Preimages` + /// - Db writes: `Preimages` + /// - Base Weight: 39.31 + .003 * b µs /// # - #[weight = 0] - fn reap_preimage(origin, proposal_hash: T::Hash) { + #[weight = (39_000_000 + T::DbWeight::get().reads_writes(1, 1)) + .saturating_add(3_000.saturating_mul(Weight::from(*proposal_len_upper_bound)))] + fn reap_preimage(origin, proposal_hash: T::Hash, #[compact] proposal_len_upper_bound: u32) { let who = ensure_signed(origin)?; + + ensure!( + Self::pre_image_data_len(proposal_hash)? <= proposal_len_upper_bound, + Error::::WrongUpperBound, + ); + let (provider, deposit, since, expiry) = >::get(&proposal_hash) .and_then(|m| match m { PreimageStatus::Available { provider, deposit, since, expiry, .. } @@ -1088,9 +1279,15 @@ decl_module! { /// - `target`: The account to remove the lock on. /// /// # - /// - `O(1)`. + /// - Complexity `O(R)` with R number of vote of target. + /// - Db reads: `VotingOf`, `balances locks`, `target account` + /// - Db writes: `VotingOf`, `balances locks`, `target account` + /// - Base Weight: + /// - Unlock Remove: 42.96 + .048 * R + /// - Unlock Set: 37.63 + .327 * R /// # - #[weight = 0] + #[weight = 43_000_000 + 330_000 * Weight::from(T::MaxVotes::get()) + + T::DbWeight::get().reads_writes(3, 3)] fn unlock(origin, target: T::AccountId) { ensure_signed(origin)?; Self::update_lock(&target); @@ -1107,9 +1304,12 @@ decl_module! { /// `close_proxy` must be called before the account can be destroyed. /// /// # - /// - One extra DB entry. + /// - Complexity: O(1) + /// - Db reads: `Proxy`, `proxy account` + /// - Db writes: `Proxy`, `proxy account` + /// - Base Weight: 14.86 µs /// # - #[weight = 100_000_000] + #[weight = 15_000_000 + T::DbWeight::get().reads_writes(2, 2)] fn open_proxy(origin, target: T::AccountId) { let who = ensure_signed(origin)?; Proxy::::mutate(&who, |a| { @@ -1147,8 +1347,12 @@ decl_module! { /// /// # /// - `O(R + log R)` where R is the number of referenda that `target` has voted on. + /// Weight is calculated for the maximum number of vote. + /// - Db reads: `ReferendumInfoOf`, `VotingOf` + /// - Db writes: `ReferendumInfoOf`, `VotingOf` + /// - Base Weight: 21.03 + .359 * R /// # - #[weight = 0] + #[weight = 21_000_000 + 360_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(2, 2)] fn remove_vote(origin, index: ReferendumIndex) -> DispatchResult { let who = ensure_signed(origin)?; Self::try_remove_vote(&who, index, UnvoteScope::Any) @@ -1169,8 +1373,12 @@ decl_module! { /// /// # /// - `O(R + log R)` where R is the number of referenda that `target` has voted on. + /// Weight is calculated for the maximum number of vote. + /// - Db reads: `ReferendumInfoOf`, `VotingOf` + /// - Db writes: `ReferendumInfoOf`, `VotingOf` + /// - Base Weight: 19.15 + .372 * R /// # - #[weight = 0] + #[weight = 19_000_000 + 370_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(2, 2)] fn remove_other_vote(origin, target: T::AccountId, index: ReferendumIndex) -> DispatchResult { let who = ensure_signed(origin)?; let scope = if target == who { UnvoteScope::Any } else { UnvoteScope::OnlyExpired }; @@ -1200,16 +1408,22 @@ decl_module! { /// Emits `Delegated`. /// /// # + /// same as `delegate with additional: + /// - Db reads: `Proxy`, `proxy account` + /// - Db writes: `proxy account` + /// - Base Weight: 68.61 + 8.039 * R µs /// # - #[weight = 500_000_000] + #[weight = weight_for::proxy_delegate::(T::MaxVotes::get().into())] pub fn proxy_delegate(origin, to: T::AccountId, conviction: Conviction, balance: BalanceOf, - ) { + ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; let target = Self::proxy(who).and_then(|a| a.as_active()).ok_or(Error::::NotProxy)?; - Self::try_delegate(target, to, conviction, balance)?; + let votes = Self::try_delegate(target, to, conviction, balance)?; + + Ok(Some(weight_for::proxy_delegate::(votes.into())).into()) } /// Undelegate the voting power of a proxied account. @@ -1223,13 +1437,17 @@ decl_module! { /// Emits `Undelegated`. /// /// # - /// - O(1). + /// same as `undelegate with additional: + /// Db reads: `Proxy` + /// Base Weight: 39 + 7.958 * R µs /// # - #[weight = 500_000_000] - fn proxy_undelegate(origin) { + #[weight = weight_for::proxy_undelegate::(T::MaxVotes::get().into())] + fn proxy_undelegate(origin) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; let target = Self::proxy(who).and_then(|a| a.as_active()).ok_or(Error::::NotProxy)?; - Self::try_undelegate(target)?; + let votes = Self::try_undelegate(target)?; + + Ok(Some(weight_for::proxy_undelegate::(votes.into())).into()) } /// Remove a proxied vote for a referendum. @@ -1244,8 +1462,12 @@ decl_module! { /// /// # /// - `O(R + log R)` where R is the number of referenda that `target` has voted on. + /// Weight is calculated for the maximum number of vote. + /// - Db reads: `ReferendumInfoOf`, `VotingOf`, `Proxy` + /// - Db writes: `ReferendumInfoOf`, `VotingOf` + /// - Base Weight: 26.35 + .36 * R µs /// # - #[weight = 0] + #[weight = 26_000_000 + 360_000 * Weight::from(T::MaxVotes::get()) + T::DbWeight::get().reads_writes(2, 3)] fn proxy_remove_vote(origin, index: ReferendumIndex) -> DispatchResult { let who = ensure_signed(origin)?; let target = Self::proxy(who).and_then(|a| a.as_active()).ok_or(Error::::NotProxy)?; @@ -1267,7 +1489,7 @@ impl Module { /// Get the amount locked in support of `proposal`; `None` if proposal isn't a valid proposal /// index. pub fn backing_for(proposal: PropIndex) -> Option> { - Self::deposit_of(proposal).map(|(d, l)| d * (l.len() as u32).into()) + Self::deposit_of(proposal).map(|(l, d)| d * (l.len() as u32).into()) } /// Get all referenda ready for tally at block `n`. @@ -1276,7 +1498,14 @@ impl Module { ) -> Vec<(ReferendumIndex, ReferendumStatus>)> { let next = Self::lowest_unbaked(); let last = Self::referendum_count(); - (next..last).into_iter() + Self::maturing_referenda_at_inner(n, next..last) + } + + fn maturing_referenda_at_inner( + n: T::BlockNumber, + range: core::ops::Range, + ) -> Vec<(ReferendumIndex, ReferendumStatus>)> { + range.into_iter() .map(|i| (i, Self::referendum_info(i))) .filter_map(|(i, maybe_info)| match maybe_info { Some(ReferendumInfo::Ongoing(status)) => Some((i, status)), @@ -1353,7 +1582,10 @@ impl Module { } votes[i].1 = vote; } - Err(i) => votes.insert(i, (ref_index, vote)), + Err(i) => { + ensure!(votes.len() as u32 <= T::MaxVotes::get(), Error::::MaxVotesReached); + votes.insert(i, (ref_index, vote)); + } } // Shouldn't be possible to fail, but we handle it gracefully. status.tally.add(vote).ok_or(Error::::Overflow)?; @@ -1416,11 +1648,14 @@ impl Module { Ok(()) } - fn increase_upstream_delegation(who: &T::AccountId, amount: Delegations>) { + /// Return the number of votes for `who` + fn increase_upstream_delegation(who: &T::AccountId, amount: Delegations>) -> u32 { VotingOf::::mutate(who, |voting| match voting { - Voting::Delegating { delegations, .. } => + Voting::Delegating { delegations, .. } => { // We don't support second level delegating, so we don't need to do anything more. - *delegations = delegations.saturating_add(amount), + *delegations = delegations.saturating_add(amount); + 1 + }, Voting::Direct { votes, delegations, .. } => { *delegations = delegations.saturating_add(amount); for &(ref_index, account_vote) in votes.iter() { @@ -1432,15 +1667,19 @@ impl Module { ); } } + votes.len() as u32 } }) } - fn reduce_upstream_delegation(who: &T::AccountId, amount: Delegations>) { + /// Return the number of votes for `who` + fn reduce_upstream_delegation(who: &T::AccountId, amount: Delegations>) -> u32 { VotingOf::::mutate(who, |voting| match voting { - Voting::Delegating { delegations, .. } => - // We don't support second level delegating, so we don't need to do anything more. - *delegations = delegations.saturating_sub(amount), + Voting::Delegating { delegations, .. } => { + // We don't support second level delegating, so we don't need to do anything more. + *delegations = delegations.saturating_sub(amount); + 1 + } Voting::Direct { votes, delegations, .. } => { *delegations = delegations.saturating_sub(amount); for &(ref_index, account_vote) in votes.iter() { @@ -1452,20 +1691,23 @@ impl Module { ); } } + votes.len() as u32 } }) } /// Attempt to delegate `balance` times `conviction` of voting power from `who` to `target`. + /// + /// Return the upstream number of votes. fn try_delegate( who: T::AccountId, target: T::AccountId, conviction: Conviction, balance: BalanceOf, - ) -> DispatchResult { + ) -> Result { ensure!(who != target, Error::::Nonsense); ensure!(balance <= T::Currency::free_balance(&who), Error::::InsufficientFunds); - VotingOf::::try_mutate(&who, |voting| -> DispatchResult { + let votes = VotingOf::::try_mutate(&who, |voting| -> Result { let mut old = Voting::Delegating { balance, target: target.clone(), @@ -1486,7 +1728,7 @@ impl Module { voting.set_common(delegations, prior); } } - Self::increase_upstream_delegation(&target, conviction.votes(balance)); + let votes = Self::increase_upstream_delegation(&target, conviction.votes(balance)); // Extend the lock to `balance` (rather than setting it) since we don't know what other // votes are in place. T::Currency::extend_lock( @@ -1495,15 +1737,17 @@ impl Module { balance, WithdrawReason::Transfer.into() ); - Ok(()) + Ok(votes) })?; Self::deposit_event(Event::::Delegated(who, target)); - Ok(()) + Ok(votes) } /// Attempt to end the current delegation. - fn try_undelegate(who: T::AccountId) -> DispatchResult { - VotingOf::::try_mutate(&who, |voting| -> DispatchResult { + /// + /// Return the number of votes of upstream. + fn try_undelegate(who: T::AccountId) -> Result { + let votes = VotingOf::::try_mutate(&who, |voting| -> Result { let mut old = Voting::default(); sp_std::mem::swap(&mut old, voting); match old { @@ -1515,20 +1759,21 @@ impl Module { mut prior, } => { // remove any delegation votes to our current target. - Self::reduce_upstream_delegation(&target, conviction.votes(balance)); + let votes = Self::reduce_upstream_delegation(&target, conviction.votes(balance)); let now = system::Module::::block_number(); let lock_periods = conviction.lock_periods().into(); prior.accumulate(now + T::EnactmentPeriod::get() * lock_periods, balance); voting.set_common(delegations, prior); + + Ok(votes) } Voting::Direct { .. } => { - return Err(Error::::NotDelegating.into()) + Err(Error::::NotDelegating.into()) } } - Ok(()) })?; Self::deposit_event(Event::::Undelegated(who)); - Ok(()) + Ok(votes) } /// Rejig the lock on an account. It will never get more stringent (since that would indicate @@ -1598,7 +1843,7 @@ impl Module { let (prop_index, proposal, _) = public_props.swap_remove(winner_index); >::put(public_props); - if let Some((deposit, depositors)) = >::take(prop_index) { + if let Some((depositors, deposit)) = >::take(prop_index) { // refund depositors for d in &depositors { T::Currency::unreserve(d, deposit); @@ -1677,19 +1922,132 @@ impl Module { } /// Current era is ending; we should finish up any proposals. - fn begin_block(now: T::BlockNumber) -> DispatchResult { + /// + /// + /// # + /// If a referendum is launched or maturing take full block weight. Otherwise: + /// - Complexity: `O(R)` where `R` is the number of unbaked referenda. + /// - Db reads: `LastTabledWasExternal`, `NextExternal`, `PublicProps`, `account`, + /// `ReferendumCount`, `LowestUnbaked` + /// - Db writes: `PublicProps`, `account`, `ReferendumCount`, `DepositOf`, `ReferendumInfoOf` + /// - Db reads per R: `DepositOf`, `ReferendumInfoOf` + /// - Base Weight: 58.58 + 10.9 * R µs + /// # + fn begin_block(now: T::BlockNumber) -> Result { + let mut weight = 60_000_000 + T::DbWeight::get().reads_writes(6, 5); + // pick out another public referendum if it's time. if (now % T::LaunchPeriod::get()).is_zero() { // Errors come from the queue being empty. we don't really care about that, and even if // we did, there is nothing we can do here. let _ = Self::launch_next(now); + weight = T::MaximumBlockWeight::get(); } // tally up votes for any expiring referenda. - for (index, info) in Self::maturing_referenda_at(now).into_iter() { + let next = Self::lowest_unbaked(); + let last = Self::referendum_count(); + let r = Weight::from(last.saturating_sub(next)); + weight += 11_000_000 * r + T::DbWeight::get().reads(2 * r); + for (index, info) in Self::maturing_referenda_at_inner(now, next..last).into_iter() { let approved = Self::bake_referendum(now, index, info)?; ReferendumInfoOf::::insert(index, ReferendumInfo::Finished { end: now, approved }); + weight = T::MaximumBlockWeight::get(); + } + + Ok(weight) + } + + /// Reads the length of account in DepositOf without getting the complete value in the runtime. + /// + /// Return 0 if no deposit for this proposal. + fn len_of_deposit_of(proposal: PropIndex) -> Option { + // DepositOf first tuple element is a vec, decoding its len is equivalent to decode a + // `Compact`. + decode_compact_u32_at(&>::hashed_key_for(proposal)) + } + + /// Check that pre image exists and its value is variant `PreimageStatus::Missing`. + /// + /// This check is done without getting the complete value in the runtime to avoid copying a big + /// value in the runtime. + fn check_pre_image_is_missing(proposal_hash: T::Hash) -> DispatchResult { + // To decode the enum variant we only need the first byte. + let mut buf = [0u8; 1]; + let key = >::hashed_key_for(proposal_hash); + let bytes = match sp_io::storage::read(&key, &mut buf, 0) { + Some(bytes) => bytes, + None => return Err(Error::::NotImminent.into()), + }; + // The value may be smaller that 1 byte. + let mut input = &buf[0..buf.len().min(bytes as usize)]; + + match input.read_byte() { + Ok(0) => Ok(()), // PreimageStatus::Missing is variant 0 + Ok(1) => Err(Error::::DuplicatePreimage.into()), + _ => { + sp_runtime::print("Failed to decode `PreimageStatus` variant"); + Err(Error::::NotImminent.into()) + } + } + } + + /// Check that pre image exists, its value is variant `PreimageStatus::Available` and decode + /// the length of `data: Vec` fields. + /// + /// This check is done without getting the complete value in the runtime to avoid copying a big + /// value in the runtime. + /// + /// If the pre image is missing variant or doesn't exist then the error `PreimageMissing` is + /// returned. + fn pre_image_data_len(proposal_hash: T::Hash) -> Result { + // To decode the `data` field of Available variant we need: + // * one byte for the variant + // * at most 5 bytes to decode a `Compact` + let mut buf = [0u8; 6]; + let key = >::hashed_key_for(proposal_hash); + let bytes = match sp_io::storage::read(&key, &mut buf, 0) { + Some(bytes) => bytes, + None => return Err(Error::::PreimageMissing.into()), + }; + // The value may be smaller that 6 bytes. + let mut input = &buf[0..buf.len().min(bytes as usize)]; + + match input.read_byte() { + Ok(1) => (), // Check that input exists and is second variant. + Ok(0) => return Err(Error::::PreimageMissing.into()), + _ => { + sp_runtime::print("Failed to decode `PreimageStatus` variant"); + return Err(Error::::PreimageMissing.into()); + } + } + + // Decode the length of the vector. + let len = codec::Compact::::decode(&mut input).map_err(|_| { + sp_runtime::print("Failed to decode `PreimageStatus` variant"); + DispatchError::from(Error::::PreimageMissing) + })?.0; + + Ok(len) + } +} + +/// Decode `Compact` from the trie at given key. +fn decode_compact_u32_at(key: &[u8]) -> Option { + // `Compact` takes at most 5 bytes. + let mut buf = [0u8; 5]; + let bytes = match sp_io::storage::read(&key, &mut buf, 0) { + Some(bytes) => bytes, + None => return None, + }; + // The value may be smaller than 5 bytes. + let mut input = &buf[0..buf.len().min(bytes as usize)]; + match codec::Compact::::decode(&mut input) { + Ok(c) => Some(c.0), + Err(_) => { + sp_runtime::print("Failed to decode compact u32 at:"); + sp_runtime::print(key); + None } - Ok(()) } } diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index 2fa9bb2328..d46214a169 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -42,6 +42,8 @@ mod proxying; mod public_proposals; mod scheduling; mod voting; +mod migration; +mod decoders; const AYE: Vote = Vote { aye: true, conviction: Conviction::None }; const NAY: Vote = Vote { aye: false, conviction: Conviction::None }; @@ -132,6 +134,7 @@ parameter_types! { pub const MinimumDeposit: u64 = 1; pub const EnactmentPeriod: u64 = 2; pub const CooloffPeriod: u64 = 2; + pub const MaxVotes: u32 = 100; } ord_parameter_types! { pub const One: u64 = 1; @@ -182,6 +185,7 @@ impl super::Trait for Test { type InstantOrigin = EnsureSignedBy; type InstantAllowed = InstantAllowed; type Scheduler = Scheduler; + type MaxVotes = MaxVotes; } pub fn new_test_ext() -> sp_io::TestExternalities { @@ -232,7 +236,7 @@ fn propose_set_balance(who: u64, value: u64, delay: u64) -> DispatchResult { Democracy::propose( Origin::signed(who), set_balance_proposal_hash(value), - delay + delay, ) } @@ -240,14 +244,14 @@ fn propose_set_balance_and_note(who: u64, value: u64, delay: u64) -> DispatchRes Democracy::propose( Origin::signed(who), set_balance_proposal_hash_and_note(value), - delay + delay, ) } fn next_block() { System::set_block_number(System::block_number() + 1); Scheduler::on_initialize(System::block_number()); - assert_eq!(Democracy::begin_block(System::block_number()), Ok(())); + assert!(Democracy::begin_block(System::block_number()).is_ok()); } fn fast_forward_to(n: u64) { diff --git a/frame/democracy/src/tests/decoders.rs b/frame/democracy/src/tests/decoders.rs new file mode 100644 index 0000000000..6b8e661ca9 --- /dev/null +++ b/frame/democracy/src/tests/decoders.rs @@ -0,0 +1,81 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! The for various partial storage decoders + +use super::*; +use frame_support::storage::{migration, StorageMap, unhashed}; + +#[test] +fn test_decode_compact_u32_at() { + new_test_ext().execute_with(|| { + let v = codec::Compact(u64::max_value()); + migration::put_storage_value(b"test", b"", &[], v); + assert_eq!(decode_compact_u32_at(b"test"), None); + + for v in vec![0, 10, u32::max_value()] { + let compact_v = codec::Compact(v); + unhashed::put(b"test", &compact_v); + assert_eq!(decode_compact_u32_at(b"test"), Some(v)); + } + + unhashed::kill(b"test"); + assert_eq!(decode_compact_u32_at(b"test"), None); + }) +} + +#[test] +fn len_of_deposit_of() { + new_test_ext().execute_with(|| { + for l in vec![0, 1, 200, 1000] { + let value: (Vec, u64) = ((0..l).map(|_| Default::default()).collect(), 3u64); + DepositOf::::insert(2, value); + assert_eq!(Democracy::len_of_deposit_of(2), Some(l)); + } + + DepositOf::::remove(2); + assert_eq!(Democracy::len_of_deposit_of(2), None); + }) +} + +#[test] +fn pre_image() { + new_test_ext().execute_with(|| { + let key = Default::default(); + let missing = PreimageStatus::Missing(0); + Preimages::::insert(key, missing); + assert!(Democracy::pre_image_data_len(key).is_err()); + assert_eq!(Democracy::check_pre_image_is_missing(key), Ok(())); + + Preimages::::remove(key); + assert!(Democracy::pre_image_data_len(key).is_err()); + assert!(Democracy::check_pre_image_is_missing(key).is_err()); + + for l in vec![0, 10, 100, 1000u32] { + let available = PreimageStatus::Available{ + data: (0..l).map(|i| i as u8).collect(), + provider: 0, + deposit: 0, + since: 0, + expiry: None, + }; + + Preimages::::insert(key, available); + assert_eq!(Democracy::pre_image_data_len(key), Ok(l)); + assert!(Democracy::check_pre_image_is_missing(key).is_err()); + } + }) +} diff --git a/frame/democracy/src/tests/migration.rs b/frame/democracy/src/tests/migration.rs new file mode 100644 index 0000000000..cab8f7f5c9 --- /dev/null +++ b/frame/democracy/src/tests/migration.rs @@ -0,0 +1,45 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! The tests for migration. + +use super::*; +use frame_support::{storage::migration, Hashable, traits::OnRuntimeUpgrade}; +use substrate_test_utils::assert_eq_uvec; + +#[test] +fn migration() { + new_test_ext().execute_with(|| { + for i in 0..3 { + let k = i.twox_64_concat(); + let v: (BalanceOf, Vec) = (i * 1000, vec![i]); + migration::put_storage_value(b"Democracy", b"DepositOf", &k, v); + } + StorageVersion::kill(); + + Democracy::on_runtime_upgrade(); + + assert_eq!(StorageVersion::get(), Some(Releases::V1)); + assert_eq_uvec!( + DepositOf::::iter().collect::>(), + vec![ + (0, (vec![0u64], >::from(0u32))), + (1, (vec![1u64], >::from(1000u32))), + (2, (vec![2u64], >::from(2000u32))), + ] + ); + }) +} diff --git a/frame/democracy/src/tests/preimage.rs b/frame/democracy/src/tests/preimage.rs index 218a0cc25c..094cde86d0 100644 --- a/frame/democracy/src/tests/preimage.rs +++ b/frame/democracy/src/tests/preimage.rs @@ -77,11 +77,11 @@ fn preimage_deposit_should_be_reapable_earlier_by_owner() { next_block(); assert_noop!( - Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2)), + Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2), u32::max_value()), Error::::TooEarly ); next_block(); - assert_ok!(Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2))); + assert_ok!(Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2), u32::max_value())); assert_eq!(Balances::free_balance(6), 60); assert_eq!(Balances::reserved_balance(6), 0); @@ -92,7 +92,7 @@ fn preimage_deposit_should_be_reapable_earlier_by_owner() { fn preimage_deposit_should_be_reapable() { new_test_ext().execute_with(|| { assert_noop!( - Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2)), + Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2), u32::max_value()), Error::::PreimageMissing ); @@ -104,12 +104,12 @@ fn preimage_deposit_should_be_reapable() { next_block(); next_block(); assert_noop!( - Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2)), + Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2), u32::max_value()), Error::::TooEarly ); next_block(); - assert_ok!(Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2))); + assert_ok!(Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2), u32::max_value())); assert_eq!(Balances::reserved_balance(6), 0); assert_eq!(Balances::free_balance(6), 48); assert_eq!(Balances::free_balance(5), 62); @@ -153,6 +153,6 @@ fn reaping_imminent_preimage_should_fail() { assert_ok!(Democracy::vote(Origin::signed(1), r, aye(1))); next_block(); next_block(); - assert_noop!(Democracy::reap_preimage(Origin::signed(6), h), Error::::Imminent); + assert_noop!(Democracy::reap_preimage(Origin::signed(6), h, u32::max_value()), Error::::Imminent); }); } diff --git a/frame/democracy/src/tests/public_proposals.rs b/frame/democracy/src/tests/public_proposals.rs index c2103fd948..68ec790baa 100644 --- a/frame/democracy/src/tests/public_proposals.rs +++ b/frame/democracy/src/tests/public_proposals.rs @@ -35,10 +35,10 @@ fn backing_for_should_work() { fn deposit_for_proposals_should_be_taken() { new_test_ext().execute_with(|| { assert_ok!(propose_set_balance_and_note(1, 2, 5)); - assert_ok!(Democracy::second(Origin::signed(2), 0)); - assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_ok!(Democracy::second(Origin::signed(5), 0)); + assert_ok!(Democracy::second(Origin::signed(2), 0, u32::max_value())); + assert_ok!(Democracy::second(Origin::signed(5), 0, u32::max_value())); + assert_ok!(Democracy::second(Origin::signed(5), 0, u32::max_value())); + assert_ok!(Democracy::second(Origin::signed(5), 0, u32::max_value())); assert_eq!(Balances::free_balance(1), 5); assert_eq!(Balances::free_balance(2), 15); assert_eq!(Balances::free_balance(5), 35); @@ -49,10 +49,10 @@ fn deposit_for_proposals_should_be_taken() { fn deposit_for_proposals_should_be_returned() { new_test_ext().execute_with(|| { assert_ok!(propose_set_balance_and_note(1, 2, 5)); - assert_ok!(Democracy::second(Origin::signed(2), 0)); - assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_ok!(Democracy::second(Origin::signed(5), 0)); - assert_ok!(Democracy::second(Origin::signed(5), 0)); + assert_ok!(Democracy::second(Origin::signed(2), 0, u32::max_value())); + assert_ok!(Democracy::second(Origin::signed(5), 0, u32::max_value())); + assert_ok!(Democracy::second(Origin::signed(5), 0, u32::max_value())); + assert_ok!(Democracy::second(Origin::signed(5), 0, u32::max_value())); fast_forward_to(3); assert_eq!(Balances::free_balance(1), 10); assert_eq!(Balances::free_balance(2), 20); @@ -78,7 +78,21 @@ fn poor_proposer_should_not_work() { fn poor_seconder_should_not_work() { new_test_ext().execute_with(|| { assert_ok!(propose_set_balance_and_note(2, 2, 11)); - assert_noop!(Democracy::second(Origin::signed(1), 0), BalancesError::::InsufficientBalance); + assert_noop!( + Democracy::second(Origin::signed(1), 0, u32::max_value()), + BalancesError::::InsufficientBalance + ); + }); +} + +#[test] +fn invalid_seconds_upper_bound_should_not_work() { + new_test_ext().execute_with(|| { + assert_ok!(propose_set_balance_and_note(1, 2, 5)); + assert_noop!( + Democracy::second(Origin::signed(2), 0, 0), + Error::::WrongUpperBound + ); }); } -- GitLab From f63db92d8009901d705c1e395feb102fdbfef962 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 15 May 2020 13:58:52 +0200 Subject: [PATCH 055/150] Fix lots of small nits in sc-network (#6028) * Fix lots of small nits in sc-network * Update client/network/src/protocol/sync/blocks.rs Co-authored-by: Arkadiy Paronyan * Fix warning * Yes. The line width. Co-authored-by: Arkadiy Paronyan --- client/network/src/behaviour.rs | 4 +- client/network/src/block_requests.rs | 4 +- client/network/src/debug_info.rs | 2 +- client/network/src/discovery.rs | 2 +- client/network/src/light_client_handler.rs | 4 +- client/network/src/on_demand_layer.rs | 2 +- client/network/src/protocol.rs | 32 ++++---- .../src/protocol/generic_proto/behaviour.rs | 16 ++-- .../protocol/generic_proto/handler/group.rs | 18 ++--- .../generic_proto/upgrade/notifications.rs | 4 +- client/network/src/protocol/sync.rs | 74 ++++++++++--------- client/network/src/protocol/sync/blocks.rs | 49 ++++++------ .../src/protocol/sync/extra_requests.rs | 2 - client/network/src/service.rs | 10 +-- 14 files changed, 111 insertions(+), 112 deletions(-) diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 656743ef7f..2394d22319 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -113,7 +113,7 @@ impl Behaviour { ) -> Self { Behaviour { substrate, - debug_info: debug_info::DebugInfoBehaviour::new(user_agent, local_public_key.clone()), + debug_info: debug_info::DebugInfoBehaviour::new(user_agent, local_public_key), discovery: disco_config.finish(), block_requests, finality_proof_requests, @@ -369,7 +369,7 @@ impl NetworkBehaviourEventProcess Self { let identify = { let proto_version = "/substrate/1.0".to_string(); - Identify::new(proto_version, user_agent, local_public_key.clone()) + Identify::new(proto_version, user_agent, local_public_key) }; DebugInfoBehaviour { diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index f5252e2695..00adc56ec5 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -675,7 +675,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { continue; } - self.discoveries.extend(list.into_iter().map(|(peer_id, _)| peer_id)); + self.discoveries.extend(list.map(|(peer_id, _)| peer_id)); if let Some(peer_id) = self.discoveries.pop_front() { let ev = DiscoveryOut::Discovered(peer_id); return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); diff --git a/client/network/src/light_client_handler.rs b/client/network/src/light_client_handler.rs index 5080d16ead..236ae81747 100644 --- a/client/network/src/light_client_handler.rs +++ b/client/network/src/light_client_handler.rs @@ -980,7 +980,9 @@ where let handler = request.connection.map_or(NotifyHandler::Any, NotifyHandler::One); let request_id = self.next_request_id(); - self.peers.get_mut(&peer).map(|p| p.status = PeerStatus::BusyWith(request_id)); + if let Some(p) = self.peers.get_mut(&peer) { + p.status = PeerStatus::BusyWith(request_id); + } self.outstanding.insert(request_id, request); let event = OutboundProtocol { diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index c4d52db351..8cf7717407 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -220,7 +220,7 @@ impl Future for RemoteResponse { fn poll(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll { match self.receiver.poll_unpin(cx) { Poll::Ready(Ok(res)) => Poll::Ready(res), - Poll::Ready(Err(_)) => Poll::Ready(Err(From::from(ClientError::RemoteFetchCancelled))), + Poll::Ready(Err(_)) => Poll::Ready(Err(ClientError::RemoteFetchCancelled)), Poll::Pending => Poll::Pending, } } diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index e9f7b3eeed..7662a476e9 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -341,7 +341,7 @@ impl BlockAnnouncesHandshake { let info = chain.info(); BlockAnnouncesHandshake { genesis_hash: info.genesis_hash, - roles: protocol_config.roles.into(), + roles: protocol_config.roles, best_number: info.best_number, best_hash: info.best_hash, } @@ -543,7 +543,7 @@ impl Protocol { response: &message::BlockResponse ) -> Option> { if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { - if let Some(_) = peer.obsolete_requests.remove(&response.id) { + if peer.obsolete_requests.remove(&response.id).is_some() { trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id); return None; } @@ -583,7 +583,7 @@ impl Protocol { Ok(message) => message, Err(err) => { debug!(target: "sync", "Couldn't decode packet sent by {}: {:?}: {}", who, data, err.what()); - self.peerset_handle.report_peer(who.clone(), rep::BAD_MESSAGE); + self.peerset_handle.report_peer(who, rep::BAD_MESSAGE); return CustomMessageOutcome::None; } }; @@ -633,7 +633,7 @@ impl Protocol { GenericMessage::Consensus(msg) => return if self.protocol_name_by_engine.contains_key(&msg.engine_id) { CustomMessageOutcome::NotificationsReceived { - remote: who.clone(), + remote: who, messages: vec![(msg.engine_id, From::from(msg.data))], } } else { @@ -655,7 +655,7 @@ impl Protocol { return if !messages.is_empty() { CustomMessageOutcome::NotificationsReceived { - remote: who.clone(), + remote: who, messages, } } else { @@ -713,7 +713,7 @@ impl Protocol { self.context_data.peers.remove(&peer) }; if let Some(_peer_data) = removed { - self.sync.peer_disconnected(peer.clone()); + self.sync.peer_disconnected(&peer); // Notify all the notification protocols as closed. CustomMessageOutcome::NotificationStreamClosed { @@ -774,9 +774,9 @@ impl Protocol { if blocks.len() >= max { break; } - let number = header.number().clone(); + let number = *header.number(); let hash = header.hash(); - let parent_hash = header.parent_hash().clone(); + let parent_hash = *header.parent_hash(); let justification = if get_justification { self.context_data.chain.justification(&BlockId::Hash(hash)).unwrap_or(None) } else { @@ -875,7 +875,7 @@ impl Protocol { return CustomMessageOutcome::None } - match self.sync.on_block_data(peer, Some(request), response) { + match self.sync.on_block_data(&peer, Some(request), response) { Ok(sync::OnBlockData::Import(origin, blocks)) => CustomMessageOutcome::BlockImport(origin, blocks), Ok(sync::OnBlockData::Request(peer, req)) => { @@ -1329,7 +1329,7 @@ impl Protocol { version: CURRENT_VERSION, min_supported_version: MIN_VERSION, genesis_hash: info.genesis_hash, - roles: self.config.roles.into(), + roles: self.config.roles, best_number: info.best_number, best_hash: info.best_hash, chain_status: Vec::new(), // TODO: find a way to make this backwards-compatible @@ -1355,7 +1355,7 @@ impl Protocol { message::BlockState::Normal => false, }; - match self.sync.on_block_announce(who.clone(), hash, &announce, is_their_best) { + match self.sync.on_block_announce(&who, hash, &announce, is_their_best) { sync::OnBlockAnnounce::Nothing => { // `on_block_announce` returns `OnBlockAnnounce::ImportHeader` // when we have all data required to import the block @@ -1375,7 +1375,7 @@ impl Protocol { // to import header from announced block let's construct response to request that normally would have // been sent over network (but it is not in our case) let blocks_to_import = self.sync.on_block_data( - who.clone(), + &who, None, message::generic::BlockResponse { id: 0, @@ -1911,7 +1911,7 @@ fn send_request( if let GenericMessage::BlockRequest(ref mut r) = message { if let Some(ref mut peer) = peers.get_mut(who) { r.id = peer.next_request_id; - peer.next_request_id = peer.next_request_id + 1; + peer.next_request_id += 1; if let Some((timestamp, request)) = peer.block_request.take() { trace!(target: "sync", "Request {} for {} is now obsolete.", request.id, who); peer.obsolete_requests.insert(request.id, timestamp); @@ -2002,7 +2002,7 @@ impl NetworkBehaviour for Protocol { for (id, r) in self.sync.block_requests() { if self.use_new_block_requests_protocol { let event = CustomMessageOutcome::BlockRequest { - target: id, + target: id.clone(), request: r, }; self.pending_messages.push_back(event); @@ -2073,11 +2073,11 @@ impl NetworkBehaviour for Protocol { let outcome = match event { GenericProtoOut::CustomProtocolOpen { peer_id, .. } => { - self.on_peer_connected(peer_id.clone()); + self.on_peer_connected(peer_id); CustomMessageOutcome::None } GenericProtoOut::CustomProtocolClosed { peer_id, .. } => { - self.on_peer_disconnected(peer_id.clone()) + self.on_peer_disconnected(peer_id) }, GenericProtoOut::LegacyMessage { peer_id, message } => self.on_custom_message(peer_id, message), diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 7bb5d986ca..4984c0d86d 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -507,7 +507,7 @@ impl GenericProto { /// /// Can be called multiple times with the same `PeerId`s. pub fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { - self.peerset.discovered(peer_ids.into_iter().map(|peer_id| { + self.peerset.discovered(peer_ids.map(|peer_id| { debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); peer_id })); @@ -616,8 +616,8 @@ impl GenericProto { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ until {:?}", occ_entry.key(), until); *occ_entry.into_mut() = PeerState::PendingRequest { - timer: futures_timer::Delay::new(until.clone() - now), - timer_deadline: until.clone(), + timer: futures_timer::Delay::new(*until - now), + timer_deadline: *until, }; }, @@ -639,8 +639,8 @@ impl GenericProto { occ_entry.key(), banned); *occ_entry.into_mut() = PeerState::DisabledPendingEnable { open, - timer: futures_timer::Delay::new(banned.clone() - now), - timer_deadline: banned.clone(), + timer: futures_timer::Delay::new(*banned - now), + timer_deadline: *banned, }; }, @@ -879,7 +879,7 @@ impl NetworkBehaviour for GenericProto { // this peer", and not "banned" in the sense that we would refuse the peer altogether. (st @ &mut PeerState::Poisoned, endpoint @ ConnectedPoint::Listener { .. }) | (st @ &mut PeerState::Banned { .. }, endpoint @ ConnectedPoint::Listener { .. }) => { - let incoming_id = self.next_incoming_index.clone(); + let incoming_id = self.next_incoming_index; self.next_incoming_index.0 = match self.next_incoming_index.0.checked_add(1) { Some(v) => v, None => { @@ -1200,7 +1200,7 @@ impl NetworkBehaviour for GenericProto { debug!(target: "sub-libp2p", "External API <= Closed({:?})", source); let event = GenericProtoOut::CustomProtocolClosed { reason, - peer_id: source.clone(), + peer_id: source, }; self.events.push(NetworkBehaviourAction::GenerateEvent(event)); } else { @@ -1384,7 +1384,7 @@ impl NetworkBehaviour for GenericProto { *peer_state = PeerState::Enabled { open }; } - st @ _ => *peer_state = st, + st => *peer_state = st, } } diff --git a/client/network/src/protocol/generic_proto/handler/group.rs b/client/network/src/protocol/generic_proto/handler/group.rs index 0e453a368c..625916a05e 100644 --- a/client/network/src/protocol/generic_proto/handler/group.rs +++ b/client/network/src/protocol/generic_proto/handler/group.rs @@ -483,35 +483,35 @@ impl ProtocolsHandler for NotifsHandler { ) -> Poll< ProtocolsHandlerEvent > { - while let Poll::Ready(ev) = self.legacy.poll(cx) { - match ev { + if let Poll::Ready(ev) = self.legacy.poll(cx) { + return match ev { ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol, info: () } => - return Poll::Ready(ProtocolsHandlerEvent::OutboundSubstreamRequest { + Poll::Ready(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: protocol.map_upgrade(EitherUpgrade::B), info: None, }), ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::CustomProtocolOpen { endpoint, .. }) => - return Poll::Ready(ProtocolsHandlerEvent::Custom( + Poll::Ready(ProtocolsHandlerEvent::Custom( NotifsHandlerOut::Open { endpoint } )), ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::CustomProtocolClosed { endpoint, reason }) => - return Poll::Ready(ProtocolsHandlerEvent::Custom( + Poll::Ready(ProtocolsHandlerEvent::Custom( NotifsHandlerOut::Closed { endpoint, reason } )), ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::CustomMessage { message }) => - return Poll::Ready(ProtocolsHandlerEvent::Custom( + Poll::Ready(ProtocolsHandlerEvent::Custom( NotifsHandlerOut::CustomMessage { message } )), ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::Clogged { messages }) => - return Poll::Ready(ProtocolsHandlerEvent::Custom( + Poll::Ready(ProtocolsHandlerEvent::Custom( NotifsHandlerOut::Clogged { messages } )), ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::ProtocolError { is_severe, error }) => - return Poll::Ready(ProtocolsHandlerEvent::Custom( + Poll::Ready(ProtocolsHandlerEvent::Custom( NotifsHandlerOut::ProtocolError { is_severe, error } )), ProtocolsHandlerEvent::Close(err) => - return Poll::Ready(ProtocolsHandlerEvent::Close(EitherError::B(err))), + Poll::Ready(ProtocolsHandlerEvent::Close(EitherError::B(err))), } } diff --git a/client/network/src/protocol/generic_proto/upgrade/notifications.rs b/client/network/src/protocol/generic_proto/upgrade/notifications.rs index cf271016e7..efcd0a4c8f 100644 --- a/client/network/src/protocol/generic_proto/upgrade/notifications.rs +++ b/client/network/src/protocol/generic_proto/upgrade/notifications.rs @@ -390,8 +390,8 @@ pub enum NotificationsOutError { /// Remote doesn't process our messages quickly enough. /// /// > **Note**: This is not necessarily the remote's fault, and could also be caused by the - /// > local node sending data too quickly. Properly doing back-pressure, however, - /// > would require a deep refactoring effort in Substrate as a whole. + /// > local node sending data too quickly. Properly doing back-pressure, however, + /// > would require a deep refactoring effort in Substrate as a whole. Clogged, } diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index b720ba0aef..f4c935de5d 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -574,7 +574,7 @@ impl ChainSync { if number > peer.best_number { peer.best_number = number; - peer.best_hash = hash.clone(); + peer.best_hash = *hash; } self.pending_requests.add(peer_id); } @@ -639,7 +639,7 @@ impl ChainSync { } /// Get an iterator over all block requests of all peers. - pub fn block_requests(&mut self) -> impl Iterator)> + '_ { + pub fn block_requests(&mut self) -> impl Iterator)> + '_ { if self.pending_requests.is_empty() { return Either::Left(std::iter::empty()) } @@ -682,7 +682,7 @@ impl ChainSync { req, ); have_requests = true; - Some((id.clone(), req)) + Some((id, req)) } else if let Some((hash, req)) = fork_sync_request( id, fork_targets, @@ -698,7 +698,7 @@ impl ChainSync { trace!(target: "sync", "Downloading fork {:?} from {}", hash, id); peer.state = PeerSyncState::DownloadingStale(hash); have_requests = true; - Some((id.clone(), req)) + Some((id, req)) } else { None } @@ -713,24 +713,27 @@ impl ChainSync { /// /// If this corresponds to a valid block, this outputs the block that /// must be imported in the import queue. - pub fn on_block_data - (&mut self, who: PeerId, request: Option>, response: BlockResponse) -> Result, BadPeer> - { + pub fn on_block_data( + &mut self, + who: &PeerId, + request: Option>, + response: BlockResponse + ) -> Result, BadPeer> { let mut new_blocks: Vec> = - if let Some(peer) = self.peers.get_mut(&who) { + if let Some(peer) = self.peers.get_mut(who) { let mut blocks = response.blocks; if request.as_ref().map_or(false, |r| r.direction == message::Direction::Descending) { trace!(target: "sync", "Reversing incoming block list"); blocks.reverse() } - self.pending_requests.add(&who); + self.pending_requests.add(who); if request.is_some() { match &mut peer.state { PeerSyncState::DownloadingNew(start_block) => { - self.blocks.clear_peer_download(&who); + self.blocks.clear_peer_download(who); let start_block = *start_block; peer.state = PeerSyncState::Available; - validate_blocks::(&blocks, &who)?; + validate_blocks::(&blocks, who)?; self.blocks.insert(start_block, blocks, who.clone()); self.blocks .drain(self.best_queued_number + One::one()) @@ -751,9 +754,9 @@ impl ChainSync { peer.state = PeerSyncState::Available; if blocks.is_empty() { debug!(target: "sync", "Empty block response from {}", who); - return Err(BadPeer(who, rep::NO_BLOCK)); + return Err(BadPeer(who.clone(), rep::NO_BLOCK)); } - validate_blocks::(&blocks, &who)?; + validate_blocks::(&blocks, who)?; blocks.into_iter().map(|b| { IncomingBlock { hash: b.hash, @@ -774,11 +777,11 @@ impl ChainSync { }, (None, _) => { debug!(target: "sync", "Invalid response when searching for ancestor from {}", who); - return Err(BadPeer(who, rep::UNKNOWN_ANCESTOR)) + return Err(BadPeer(who.clone(), rep::UNKNOWN_ANCESTOR)) }, (_, Err(e)) => { info!("❌ Error answering legitimate blockchain query: {:?}", e); - return Err(BadPeer(who, rep::BLOCKCHAIN_READ_ERROR)) + return Err(BadPeer(who.clone(), rep::BLOCKCHAIN_READ_ERROR)) } }; if matching_hash.is_some() { @@ -794,7 +797,7 @@ impl ChainSync { } if matching_hash.is_none() && current.is_zero() { trace!(target:"sync", "Ancestry search: genesis mismatch for peer {}", who); - return Err(BadPeer(who, rep::GENESIS_MISMATCH)) + return Err(BadPeer(who.clone(), rep::GENESIS_MISMATCH)) } if let Some((next_state, next_num)) = handle_ancestor_search_state(state, *current, matching_hash.is_some()) { peer.state = PeerSyncState::AncestorSearch { @@ -802,7 +805,7 @@ impl ChainSync { start: *start, state: next_state, }; - return Ok(OnBlockData::Request(who, ancestry_request::(next_num))) + return Ok(OnBlockData::Request(who.clone(), ancestry_request::(next_num))) } else { // Ancestry search is complete. Check if peer is on a stale fork unknown to us and // add it to sync targets if necessary. @@ -838,7 +841,7 @@ impl ChainSync { } } else { // When request.is_none() this is a block announcement. Just accept blocks. - validate_blocks::(&blocks, &who)?; + validate_blocks::(&blocks, who)?; blocks.into_iter().map(|b| { IncomingBlock { hash: b.hash, @@ -869,7 +872,7 @@ impl ChainSync { // So the only way this can happen is when peers lie about the // common block. debug!(target: "sync", "Ignoring known blocks from {}", who); - return Err(BadPeer(who, rep::KNOWN_BLOCK)); + return Err(BadPeer(who.clone(), rep::KNOWN_BLOCK)); } let orig_len = new_blocks.len(); new_blocks.retain(|b| !self.queue_blocks.contains(&b.hash)); @@ -1124,7 +1127,7 @@ impl ChainSync { /// Updates our internal state for best queued block and then goes /// through all peers to update our view of their state as well. fn on_block_queued(&mut self, hash: &B::Hash, number: NumberFor) { - if let Some(_) = self.fork_targets.remove(&hash) { + if self.fork_targets.remove(&hash).is_some() { trace!(target: "sync", "Completed fork sync {:?}", hash); } if number > self.best_queued_number { @@ -1162,7 +1165,7 @@ impl ChainSync { /// header (call `on_block_data`). The network request isn't sent /// in this case. Both hash and header is passed as an optimization /// to avoid rehashing the header. - pub fn on_block_announce(&mut self, who: PeerId, hash: B::Hash, announce: &BlockAnnounce, is_best: bool) + pub fn on_block_announce(&mut self, who: &PeerId, hash: B::Hash, announce: &BlockAnnounce, is_best: bool) -> OnBlockAnnounce { let header = &announce.header; @@ -1177,7 +1180,7 @@ impl ChainSync { let ancient_parent = parent_status == BlockStatus::InChainPruned; let known = self.is_known(&hash); - let peer = if let Some(peer) = self.peers.get_mut(&who) { + let peer = if let Some(peer) = self.peers.get_mut(who) { peer } else { error!(target: "sync", "💔 Called on_block_announce with a bad peer ID"); @@ -1206,13 +1209,13 @@ impl ChainSync { peer.common_number = number - One::one(); } } - self.pending_requests.add(&who); + self.pending_requests.add(who); // known block case if known || self.is_already_downloading(&hash) { trace!(target: "sync", "Known block announce from {}: {}", who, hash); if let Some(target) = self.fork_targets.get_mut(&hash) { - target.peers.insert(who); + target.peers.insert(who.clone()); } return OnBlockAnnounce::Nothing } @@ -1251,21 +1254,21 @@ impl ChainSync { .entry(hash.clone()) .or_insert_with(|| ForkTarget { number, - parent_hash: Some(header.parent_hash().clone()), + parent_hash: Some(*header.parent_hash()), peers: Default::default(), }) - .peers.insert(who); + .peers.insert(who.clone()); } OnBlockAnnounce::Nothing } /// Call when a peer has disconnected. - pub fn peer_disconnected(&mut self, who: PeerId) { - self.blocks.clear_peer_download(&who); - self.peers.remove(&who); - self.extra_justifications.peer_disconnected(&who); - self.extra_finality_proofs.peer_disconnected(&who); + pub fn peer_disconnected(&mut self, who: &PeerId) { + self.blocks.clear_peer_download(who); + self.peers.remove(who); + self.extra_justifications.peer_disconnected(who); + self.extra_finality_proofs.peer_disconnected(who); self.pending_requests.set_all(); } @@ -1471,11 +1474,12 @@ fn fork_sync_request( } if r.number <= best_num { let parent_status = r.parent_hash.as_ref().map_or(BlockStatus::Unknown, check_block); - let mut count = (r.number - finalized).saturated_into::(); // up to the last finalized block - if parent_status != BlockStatus::Unknown { + let count = if parent_status == BlockStatus::Unknown { + (r.number - finalized).saturated_into::() // up to the last finalized block + } else { // request only single block - count = 1; - } + 1 + }; trace!(target: "sync", "Downloading requested fork {:?} from {}, {} blocks", hash, id, count); return Some((hash.clone(), message::generic::BlockRequest { id: 0, diff --git a/client/network/src/protocol/sync/blocks.rs b/client/network/src/protocol/sync/blocks.rs index e59f22509c..c79c0d7f51 100644 --- a/client/network/src/protocol/sync/blocks.rs +++ b/client/network/src/protocol/sync/blocks.rs @@ -18,7 +18,6 @@ use std::cmp; use std::ops::Range; use std::collections::{HashMap, BTreeMap}; -use std::collections::hash_map::Entry; use log::trace; use libp2p::PeerId; use sp_runtime::traits::{Block as BlockT, NumberFor, One}; @@ -117,17 +116,17 @@ impl BlockCollection { let mut prev: Option<(&NumberFor, &BlockRangeState)> = None; loop { let next = downloading_iter.next(); - break match &(prev, next) { - &(Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) + break match (prev, next) { + (Some((start, &BlockRangeState::Downloading { ref len, downloading })), _) if downloading < max_parallel => (*start .. *start + *len, downloading), - &(Some((start, r)), Some((next_start, _))) if *start + r.len() < *next_start => + (Some((start, r)), Some((next_start, _))) if *start + r.len() < *next_start => (*start + r.len() .. cmp::min(*next_start, *start + r.len() + count), 0), // gap - &(Some((start, r)), None) => + (Some((start, r)), None) => (*start + r.len() .. *start + r.len() + count, 0), // last range - &(None, None) => + (None, None) => (first_different .. first_different + count, 0), // empty - &(None, Some((start, _))) if *start > first_different => + (None, Some((start, _))) if *start > first_different => (first_different .. cmp::min(first_different + count, *start), 0), // gap at the start _ => { prev = next; @@ -168,7 +167,7 @@ impl BlockCollection { let mut prev = from; for (start, range_data) in &mut self.blocks { match range_data { - &mut BlockRangeState::Complete(ref mut blocks) if *start <= prev => { + BlockRangeState::Complete(blocks) if *start <= prev => { prev = *start + (blocks.len() as u32).into(); // Remove all elements from `blocks` and add them to `drained` drained.append(blocks); @@ -186,26 +185,22 @@ impl BlockCollection { } pub fn clear_peer_download(&mut self, who: &PeerId) { - match self.peer_requests.entry(who.clone()) { - Entry::Occupied(entry) => { - let start = entry.remove(); - let remove = match self.blocks.get_mut(&start) { - Some(&mut BlockRangeState::Downloading { ref mut downloading, .. }) if *downloading > 1 => { - *downloading = *downloading - 1; - false - }, - Some(&mut BlockRangeState::Downloading { .. }) => { - true - }, - _ => { - false - } - }; - if remove { - self.blocks.remove(&start); + if let Some(start) = self.peer_requests.remove(who) { + let remove = match self.blocks.get_mut(&start) { + Some(&mut BlockRangeState::Downloading { ref mut downloading, .. }) if *downloading > 1 => { + *downloading -= 1; + false + }, + Some(&mut BlockRangeState::Downloading { .. }) => { + true + }, + _ => { + false } - }, - _ => (), + }; + if remove { + self.blocks.remove(&start); + } } } } diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index 09fcdcf491..1e63749c25 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -103,11 +103,9 @@ impl ExtraRequests { // we have finalized further than the given request, presumably // by some other part of the system (not sync). we can safely // ignore the `Revert` error. - return; }, Err(err) => { debug!(target: "sync", "Failed to insert request {:?} into tree: {:?}", request, err); - return; } _ => () } diff --git a/client/network/src/service.rs b/client/network/src/service.rs index f80801b1cc..ba6c7a39b4 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -195,7 +195,7 @@ impl NetworkWorker { let checker = params.on_demand.as_ref() .map(|od| od.checker().clone()) - .unwrap_or(Arc::new(AlwaysBadChecker)); + .unwrap_or_else(|| Arc::new(AlwaysBadChecker)); let num_connected = Arc::new(AtomicUsize::new(0)); let is_major_syncing = Arc::new(AtomicBool::new(false)); @@ -320,7 +320,7 @@ impl NetworkWorker { is_major_syncing: is_major_syncing.clone(), peerset: peerset_handle, local_peer_id, - to_worker: to_worker.clone(), + to_worker, _marker: PhantomData, }); @@ -447,7 +447,7 @@ impl NetworkWorker { Some((peer_id.to_base58(), NetworkStatePeer { endpoint, version_string: swarm.node(peer_id) - .and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + .and_then(|i| i.client_version().map(|s| s.to_owned())), latest_ping_time: swarm.node(peer_id).and_then(|i| i.latest_ping()), enabled: swarm.user_protocol().is_enabled(&peer_id), open: swarm.user_protocol().is_open(&peer_id), @@ -463,7 +463,7 @@ impl NetworkWorker { list.into_iter().map(move |peer_id| { (peer_id.to_base58(), NetworkStateNotConnectedPeer { version_string: swarm.node(&peer_id) - .and_then(|i| i.client_version().map(|s| s.to_owned())).clone(), + .and_then(|i| i.client_version().map(|s| s.to_owned())), latest_ping_time: swarm.node(&peer_id).and_then(|i| i.latest_ping()), known_addresses: NetworkBehaviour::addresses_of_peer(&mut **swarm, &peer_id) .into_iter().collect(), @@ -608,7 +608,7 @@ impl NetworkService { pub fn request_justification(&self, hash: &B::Hash, number: NumberFor) { let _ = self .to_worker - .unbounded_send(ServiceToWorkerMsg::RequestJustification(hash.clone(), number)); + .unbounded_send(ServiceToWorkerMsg::RequestJustification(*hash, number)); } /// Are we in the process of downloading the chain? -- GitLab From a4f1c7a45e2a39685e0774e43c8606045cdbace1 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Fri, 15 May 2020 14:00:41 +0200 Subject: [PATCH 056/150] Put some graphics in the README? (#5930) * Update README.md I didn't do a good job at making the gif, but this is just a proposal. If accepted, I can make a better one or ask Max to help with it. * better gif file * New file --- README.md | 7 ++++++- docs/media/sub.gif | Bin 0 -> 476866 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/media/sub.gif diff --git a/README.md b/README.md index 62ec466e0e..874ec99e69 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # Substrate · [![GitHub license](https://img.shields.io/github/license/paritytech/substrate)](LICENSE) [![GitLab Status](https://gitlab.parity.io/parity/substrate/badges/master/pipeline.svg)](https://gitlab.parity.io/parity/substrate/pipelines) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](docs/CONTRIBUTING.adoc) -Substrate is a next-generation framework for blockchain innovation. +

+ +

+ + +Substrate is a next-generation framework for blockchain innovation 🚀. ## Trying it out diff --git a/docs/media/sub.gif b/docs/media/sub.gif new file mode 100644 index 0000000000000000000000000000000000000000..d8d73d9171aac0751961206256cf1d219416814e GIT binary patch literal 476866 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

MX8()2N#>osi|EJ3^^aH3%D`!U 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%0ALQc!ARpYQN+@UrKt6uErFpyMXO{Kce!0g()Sg^i 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 hl)#D|yr@YpR@ju|SqjPF&T?rMNN&ZPXiW}} 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

(i? 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

52W~;yLaD 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≈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

yKSd=9Ut!9)lJ~|Tw|9??X9V0x`&vfG%l)) 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¬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 literal 0 HcmV?d00001 -- GitLab From 5353480eee102b7ff6cce7b16c8654a63fc7a4e4 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Fri, 15 May 2020 14:07:12 +0200 Subject: [PATCH 057/150] Benchmarks for elections-phragmen pallet (#5845) * Fist benchmark barely working * Debug checkpoint * add rest of benchmarks * Add to runtime * Fix build * Update frame/elections-phragmen/src/benchmarking.rs Co-authored-by: Shawn Tabrizi * Update frame/elections-phragmen/src/benchmarking.rs Co-authored-by: Shawn Tabrizi * major imp * Make them run on release * Help finish phragmen benchmarks (#5886) * update caller, account, and member/runner-up creation * remove stuff * ocd * make it work with real run * relax the numbers a bit * New and improved version * Make elections-phragmen weighable and secure. (#5949) * Make elections-phragmen weighable. * Update frame/elections-phragmen/src/lib.rs Co-authored-by: Alexander Popiak * Update frame/elections-phragmen/src/lib.rs Co-authored-by: Alexander Popiak * Fix all tests * Fix everything * Add note Co-authored-by: Alexander Popiak * Doc update * Fix some complexity params * Once more ready to benchmark * ready for bench * final tunes * Update frame/elections-phragmen/src/lib.rs * Fix fix * Update frame/elections-phragmen/src/lib.rs * Update frame/elections-phragmen/src/benchmarking.rs Co-authored-by: Alexander Popiak * Update frame/elections-phragmen/src/benchmarking.rs Co-authored-by: Alexander Popiak * Update to latest weights * Some fixes * Fix dual voter read from @thiolliere * Remove todos * review from @shawntabrizi * Fix bench tests. Co-authored-by: Shawn Tabrizi Co-authored-by: Alexander Popiak --- Cargo.lock | 2 +- bin/node/runtime/src/lib.rs | 1 + frame/benchmarking/src/lib.rs | 4 + frame/elections-phragmen/Cargo.toml | 8 +- frame/elections-phragmen/src/benchmarking.rs | 600 ++++++++ frame/elections-phragmen/src/lib.rs | 1318 +++++++++++------- frame/support/src/lib.rs | 15 +- frame/timestamp/src/benchmarking.rs | 2 + primitives/runtime/src/lib.rs | 22 +- 9 files changed, 1491 insertions(+), 481 deletions(-) create mode 100644 frame/elections-phragmen/src/benchmarking.rs diff --git a/Cargo.lock b/Cargo.lock index f0bdcef29b..d4dc8ac49b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4171,11 +4171,11 @@ dependencies = [ name = "pallet-elections-phragmen" version = "2.0.0-dev" dependencies = [ + "frame-benchmarking", "frame-support", "frame-system", "hex-literal", "pallet-balances", - "pallet-scheduler", "parity-scale-codec", "serde", "sp-core", diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 32ba8c94db..12c105e940 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -982,6 +982,7 @@ impl_runtime_apis! { add_benchmark!(params, batches, b"balances", Balances); add_benchmark!(params, batches, b"collective", Council); add_benchmark!(params, batches, b"democracy", Democracy); + add_benchmark!(params, batches, b"elections", Elections); add_benchmark!(params, batches, b"identity", Identity); add_benchmark!(params, batches, b"im-online", ImOnline); add_benchmark!(params, batches, b"offences", OffencesBench::); diff --git a/frame/benchmarking/src/lib.rs b/frame/benchmarking/src/lib.rs index 27966545f7..ae9ef90764 100644 --- a/frame/benchmarking/src/lib.rs +++ b/frame/benchmarking/src/lib.rs @@ -922,6 +922,10 @@ macro_rules! impl_benchmark_tests { let selected_benchmark = SelectedBenchmark::$name; let components = >::components(&selected_benchmark); + assert!( + components.len() != 0, + "You need to add components to your benchmark!", + ); for (_, (name, low, high)) in components.iter().enumerate() { // Test only the low and high value, assuming values in the middle won't break for component_value in vec![low, high] { diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index 4fe85e7733..f9a3ec0b21 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -19,12 +19,12 @@ sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../p frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } hex-literal = "0.2.1" pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-scheduler = { version = "2.0.0-dev", path = "../scheduler" } sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } @@ -39,4 +39,8 @@ std = [ "frame-system/std", "sp-std/std", ] -runtime-benchmarks = ["frame-support/runtime-benchmarks"] +runtime-benchmarks = [ + "frame-benchmarking", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", +] diff --git a/frame/elections-phragmen/src/benchmarking.rs b/frame/elections-phragmen/src/benchmarking.rs new file mode 100644 index 0000000000..6de9ad57e2 --- /dev/null +++ b/frame/elections-phragmen/src/benchmarking.rs @@ -0,0 +1,600 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Elections-Phragmen pallet benchmarking. + +#![cfg(feature = "runtime-benchmarks")] + +use super::*; + +use frame_system::RawOrigin; +use frame_benchmarking::{benchmarks, account}; +use frame_support::traits::OnInitialize; + +use crate::Module as Elections; + +const BALANCE_FACTOR: u32 = 250; +const MAX_VOTERS: u32 = 500; +const MAX_CANDIDATES: u32 = 100; + +type Lookup = <::Lookup as StaticLookup>::Source; + +/// grab new account with infinite balance. +fn endowed_account(name: &'static str, index: u32) -> T::AccountId { + let account: T::AccountId = account(name, index, 0); + let amount = default_stake::(BALANCE_FACTOR); + let _ = T::Currency::make_free_balance_be(&account, amount); + // important to increase the total issuance since T::CurrencyToVote will need it to be sane for + // phragmen to work. + T::Currency::issue(amount); + account +} + +/// Account to lookup type of system trait. +fn as_lookup(account: T::AccountId) -> Lookup { + T::Lookup::unlookup(account) +} + +/// Get a reasonable amount of stake based on the execution trait's configuration +fn default_stake(factor: u32) -> BalanceOf { + let factor = BalanceOf::::from(factor); + T::Currency::minimum_balance() * factor +} + +/// Get the current number of candidates. +fn candidate_count() -> u32 { + >::decode_len().unwrap_or(0usize) as u32 +} + +/// Get the number of votes of a voter. +fn vote_count_of(who: &T::AccountId) -> u32 { + >::get(who).1.len() as u32 +} + +/// A `DefunctVoter` struct with correct value +fn defunct_for(who: T::AccountId) -> DefunctVoter> { + DefunctVoter { + who: as_lookup::(who.clone()), + candidate_count: candidate_count::(), + vote_count: vote_count_of::(&who), + } +} + +/// Add `c` new candidates. +fn submit_candidates(c: u32, prefix: &'static str) + -> Result, &'static str> +{ + (0..c).map(|i| { + let account = endowed_account::(prefix, i); + >::submit_candidacy( + RawOrigin::Signed(account.clone()).into(), + candidate_count::(), + ).map_err(|_| "failed to submit candidacy")?; + Ok(account) + }).collect::>() +} + +/// Add `c` new candidates with self vote. +fn submit_candidates_with_self_vote(c: u32, prefix: &'static str) + -> Result, &'static str> +{ + let candidates = submit_candidates::(c, prefix)?; + let stake = default_stake::(BALANCE_FACTOR); + let _ = candidates.iter().map(|c| + submit_voter::(c.clone(), vec![c.clone()], stake) + ).collect::>()?; + Ok(candidates) +} + + +/// Submit one voter. +fn submit_voter(caller: T::AccountId, votes: Vec, stake: BalanceOf) + -> Result<(), &'static str> +{ + >::vote(RawOrigin::Signed(caller).into(), votes, stake) + .map_err(|_| "failed to submit vote") +} + +/// create `num_voter` voters who randomly vote for at most `votes` of `all_candidates` if +/// available. +fn distribute_voters(mut all_candidates: Vec, num_voters: u32, votes: usize) + -> Result<(), &'static str> +{ + let stake = default_stake::(BALANCE_FACTOR); + for i in 0..num_voters { + // to ensure that votes are different + all_candidates.rotate_left(1); + let votes = all_candidates + .iter() + .cloned() + .take(votes) + .collect::>(); + let voter = endowed_account::("voter", i); + submit_voter::(voter, votes, stake)?; + } + Ok(()) +} + +/// Fill the seats of members and runners-up up until `m`. Note that this might include either only +/// members, or members and runners-up. +fn fill_seats_up_to(m: u32) -> Result, &'static str> { + let candidates = submit_candidates_with_self_vote::(m, "fill_seats_up_to")?; + assert_eq!(>::candidates().len() as u32, m, "wrong number of candidates."); + >::do_phragmen(); + assert_eq!(>::candidates().len(), 0, "some candidates remaining."); + assert_eq!( + >::members().len() + >::runners_up().len(), + m as usize, + "wrong number of members and runners-up", + ); + Ok(candidates) +} + +/// removes all the storage items to reverse any genesis state. +fn clean() { + >::kill(); + >::kill(); + >::kill(); + let _ = >::drain(); +} + +benchmarks! { + _ { + // User account seed + let u in 0 .. 1000 => (); + } + + // -- Signed ones + vote { + let u in ...; + // we fix the number of voted candidates to max + let v = MAXIMUM_VOTE; + clean::(); + + // create a bunch of candidates. + let all_candidates = submit_candidates::(MAXIMUM_VOTE as u32, "candidates")?; + + let caller = endowed_account::("caller", u); + let stake = default_stake::(BALANCE_FACTOR); + + // vote for all of them. + let votes = all_candidates.into_iter().take(v).collect(); + + }: _(RawOrigin::Signed(caller), votes, stake) + + vote_update { + let u in ...; + // we fix the number of voted candidates to max + let v = MAXIMUM_VOTE; + clean::(); + + // create a bunch of candidates. + let all_candidates = submit_candidates::(MAXIMUM_VOTE as u32, "candidates")?; + + let caller = endowed_account::("caller", u); + let stake = default_stake::(BALANCE_FACTOR); + + // original votes. + let mut votes = all_candidates.into_iter().take(v).collect::>(); + submit_voter::(caller.clone(), votes.clone(), stake)?; + // new votes. + votes.rotate_left(1); + }: vote(RawOrigin::Signed(caller), votes, stake) + + remove_voter { + let u in ...; + // we fix the number of voted candidates to max + let v = MAXIMUM_VOTE as u32; + clean::(); + + // create a bunch of candidates. + let all_candidates = submit_candidates::(v, "candidates")?; + + let caller = endowed_account::("caller", u); + + let stake = default_stake::(BALANCE_FACTOR); + submit_voter::(caller.clone(), all_candidates, stake)?; + + }: _(RawOrigin::Signed(caller)) + + report_defunct_voter_correct { + // number of already existing candidates that may or may not be voted by the reported + // account. + let c in 1 .. MAX_CANDIDATES; + // number of candidates that the reported voter voted for. The worse case of search here is + // basically `c * v`. + let v in 1 .. (MAXIMUM_VOTE as u32); + // we fix the number of members to when members and runners-up to the desired. We'll be in + // this state almost always. + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + clean::(); + + let stake = default_stake::(BALANCE_FACTOR); + + // create m members and runners combined. + let _ = fill_seats_up_to::(m)?; + + // create a bunch of candidates as well. + let bailing_candidates = submit_candidates::(v, "bailing_candidates")?; + let all_candidates = submit_candidates::(c, "all_candidates")?; + + // account 1 is the reporter and it doesn't matter how many it votes. But it has to be a + // voter. + let account_1 = endowed_account::("caller", 0); + submit_voter::( + account_1.clone(), + all_candidates.iter().take(1).cloned().collect(), + stake, + )?; + + // account 2 votes for all of the mentioned candidates. + let account_2 = endowed_account::("caller_2", 1); + submit_voter::( + account_2.clone(), + bailing_candidates.clone(), + stake, + )?; + + // all the bailers go away. + bailing_candidates.into_iter().for_each(|b| { + let count = candidate_count::(); + assert!(>::renounce_candidacy( + RawOrigin::Signed(b).into(), + Renouncing::Candidate(count), + ).is_ok()); + }); + let defunct = defunct_for::(account_2.clone()); + }: report_defunct_voter(RawOrigin::Signed(account_1.clone()), defunct) + verify { + assert!(>::is_voter(&account_1)); + assert!(!>::is_voter(&account_2)); + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + report_defunct_voter_incorrect { + // number of already existing candidates that may or may not be voted by the reported + // account. + let c in 1 .. MAX_CANDIDATES; + // number of candidates that the reported voter voted for. The worse case of search here is + // basically `c * v`. + let v in 1 .. (MAXIMUM_VOTE as u32); + // we fix the number of members to when members and runners-up to the desired. We'll be in + // this state almost always. + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + + clean::(); + let stake = default_stake::(BALANCE_FACTOR); + + // create m members and runners combined. + let _ = fill_seats_up_to::(m)?; + + // create a bunch of candidates as well. + let all_candidates = submit_candidates::(c, "candidates")?; + + // account 1 is the reporter and it doesn't matter how many it votes. + let account_1 = endowed_account::("caller", 0); + submit_voter::( + account_1.clone(), + all_candidates.iter().take(1).cloned().collect(), + stake, + )?; + + // account 2 votes for a bunch of crap, and finally a correct candidate. + let account_2 = endowed_account::("caller_2", 1); + let mut invalid: Vec = + (0..(v-1)).map(|seed| account::("invalid", 0, seed).clone()).collect(); + invalid.push(all_candidates.last().unwrap().clone()); + submit_voter::( + account_2.clone(), + invalid, + stake, + )?; + + let defunct = defunct_for::(account_2.clone()); + // no one bails out. account_1 is slashed and removed as voter now. + }: report_defunct_voter(RawOrigin::Signed(account_1.clone()), defunct) + verify { + assert!(!>::is_voter(&account_1)); + assert!(>::is_voter(&account_2)); + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + submit_candidacy { + // number of already existing candidates. + let c in 1 .. MAX_CANDIDATES; + // we fix the number of members to when members and runners-up to the desired. We'll be in + // this state almost always. + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + + clean::(); + let stake = default_stake::(BALANCE_FACTOR); + + // create m members and runners combined. + let _ = fill_seats_up_to::(m)?; + + // create previous candidates; + let _ = submit_candidates::(c, "candidates")?; + + // we assume worse case that: extrinsic is successful and candidate is not duplicate. + let candidate_account = endowed_account::("caller", 0); + }: _(RawOrigin::Signed(candidate_account.clone()), candidate_count::()) + verify { + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + renounce_candidacy_candidate { + // this will check members, runners-up and candidate for removal. Members and runners-up are + // limited by the runtime bound, nonetheless we fill them by `m`. + // number of already existing candidates. + let c in 1 .. MAX_CANDIDATES; + // we fix the number of members to when members and runners-up to the desired. We'll be in + // this state almost always. + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + + clean::(); + + // create m members and runners combined. + let _ = fill_seats_up_to::(m)?; + let all_candidates = submit_candidates::(c, "caller")?; + + let bailing = all_candidates[0].clone(); // Should be ("caller", 0) + let count = candidate_count::(); + }: renounce_candidacy(RawOrigin::Signed(bailing), Renouncing::Candidate(count)) + verify { + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + renounce_candidacy_member_runner_up { + // removing members and runners will be cheaper than a candidate. + // we fix the number of members to when members and runners-up to the desired. We'll be in + // this state almost always. + let u in ...; + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + clean::(); + + // create m members and runners combined. + let members_and_runners_up = fill_seats_up_to::(m)?; + + let bailing = members_and_runners_up[0].clone(); + let renouncing = if >::is_member(&bailing) { + Renouncing::Member + } else if >::is_runner_up(&bailing) { + Renouncing::RunnerUp + } else { + panic!("Bailing must be a member or runner-up for this bench to be sane."); + }; + }: renounce_candidacy(RawOrigin::Signed(bailing.clone()), renouncing) + verify { + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + // -- Root ones + remove_member_without_replacement { + // worse case is when we remove a member and we have no runner as a replacement. This + // triggers phragmen again. The only parameter is how many candidates will compete for the + // new slot. + let c in 1 .. MAX_CANDIDATES; + clean::(); + + // fill only desired members. no runners-up. + let all_members = fill_seats_up_to::(T::DesiredMembers::get())?; + assert_eq!(>::members().len() as u32, T::DesiredMembers::get()); + + // submit a new one to compensate, with self-vote. + let replacements = submit_candidates_with_self_vote::(c, "new_candidate")?; + + // create some voters for these replacements. + distribute_voters::(replacements, MAX_VOTERS, MAXIMUM_VOTE)?; + + let to_remove = as_lookup::(all_members[0].clone()); + }: remove_member(RawOrigin::Root, to_remove, false) + verify { + // must still have the desired number of members members. + assert_eq!(>::members().len() as u32, T::DesiredMembers::get()); + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + remove_member_with_replacement { + // easy case. We have a runner up. Nothing will have that much of an impact. m will be + // number of members and runners. There is always at least one runner. + let u in ...; + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + clean::(); + + let _ = fill_seats_up_to::(m)?; + let removing = as_lookup::(>::members_ids()[0].clone()); + }: remove_member(RawOrigin::Root, removing, true) + verify { + // must still have enough members. + assert_eq!(>::members().len() as u32, T::DesiredMembers::get()); + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + remove_member_wrong_refund { + // The root call by mistake indicated that this will have no replacement, while it has! + // this has now consumed a lot of weight and need to refund. + let u in ...; + let m = T::DesiredMembers::get() + T::DesiredRunnersUp::get(); + clean::(); + + let _ = fill_seats_up_to::(m)?; + let removing = as_lookup::(>::members_ids()[0].clone()); + }: { + assert_eq!( + >::remove_member(RawOrigin::Root.into(), removing, false).unwrap_err().error, + Error::::InvalidReplacement.into(), + ); + } + verify { + // must still have enough members. + assert_eq!(>::members().len() as u32, T::DesiredMembers::get()); + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + on_initialize { + // if n % TermDuration is zero, then we run phragmen. The weight function must and should + // check this as it is cheap to do so. TermDuration is not a storage item, it is a constant + // encoded in the runtime. + let c in 1 .. MAX_CANDIDATES; + clean::(); + + // create c candidates. + let all_candidates = submit_candidates_with_self_vote::(c, "candidates")?; + // create 500 voters, each voting the maximum 16 + distribute_voters::(all_candidates, MAX_VOTERS, MAXIMUM_VOTE)?; + }: { + // elect + >::on_initialize(T::TermDuration::get()); + } + verify { + assert_eq!(>::members().len() as u32, T::DesiredMembers::get().min(c)); + assert_eq!( + >::runners_up().len() as u32, + T::DesiredRunnersUp::get().min(c.saturating_sub(T::DesiredMembers::get())), + ); + + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } + + phragmen { + // This is just to focus on phragmen in the context of this module. We always select 20 + // members, this is hard-coded in the runtime and cannot be trivially changed at this stage. + // Yet, change the number of voters, candidates and edge per voter to see the impact. Note + // that we give all candidates a self vote to make sure they are all considered. + let c in 1 .. MAX_CANDIDATES; + let v in 1 .. MAX_VOTERS; + let e in 1 .. (MAXIMUM_VOTE as u32); + clean::(); + + let all_candidates = submit_candidates_with_self_vote::(c, "candidates")?; + let _ = distribute_voters::(all_candidates, v, e as usize)?; + }: { + >::on_initialize(T::TermDuration::get()); + } + verify { + assert_eq!(>::members().len() as u32, T::DesiredMembers::get().min(c)); + assert_eq!( + >::runners_up().len() as u32, + T::DesiredRunnersUp::get().min(c.saturating_sub(T::DesiredMembers::get())), + ); + + #[cfg(test)] + { + // reset members in between benchmark tests. + use crate::tests::MEMBERS; + MEMBERS.with(|m| *m.borrow_mut() = vec![]); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::tests::{ExtBuilder, Test}; + use frame_support::assert_ok; + + #[test] + fn test_benchmarks_elections_phragmen() { + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_vote::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_remove_voter::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_report_defunct_voter_correct::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_report_defunct_voter_incorrect::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_submit_candidacy::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_renounce_candidacy_candidate::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_renounce_candidacy_member_runner_up::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_remove_member_without_replacement::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_remove_member_with_replacement::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_on_initialize::()); + }); + + ExtBuilder::default().desired_members(13).desired_runners_up(7).build_and_execute(|| { + assert_ok!(test_benchmark_phragmen::()); + }); + } +} diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 0133abc648..4e2ae09afa 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -83,14 +83,17 @@ #![cfg_attr(not(feature = "std"), no_std)] +use codec::{Encode, Decode}; use sp_std::prelude::*; use sp_runtime::{ - print, DispatchResult, DispatchError, Perbill, traits::{Zero, StaticLookup, Convert}, + DispatchError, RuntimeDebug, Perbill, + traits::{Zero, StaticLookup, Convert}, }; use frame_support::{ decl_storage, decl_event, ensure, decl_module, decl_error, - weights::{Weight, DispatchClass}, + weights::{Weight, constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS}}, storage::{StorageMap, IterableStorageMap}, + dispatch::{DispatchResultWithPostInfo, WithPostDispatchInfo}, traits::{ Currency, Get, LockableCurrency, LockIdentifier, ReservableCurrency, WithdrawReasons, ChangeMembers, OnUnbalanced, WithdrawReason, Contains, BalanceStatus, InitializeMembers, @@ -100,13 +103,40 @@ use frame_support::{ use sp_phragmen::{build_support_map, ExtendedBalance, VoteWeight, PhragmenResult}; use frame_system::{self as system, ensure_signed, ensure_root}; +mod benchmarking; + /// The maximum votes allowed per voter. pub const MAXIMUM_VOTE: usize = 16; -type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; +type BalanceOf = + <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; +/// An indication that the renouncing account currently has which of the below roles. +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +pub enum Renouncing { + /// A member is renouncing. + Member, + /// A runner-up is renouncing. + RunnerUp, + /// A candidate is renouncing, while the given total number of candidates exists. + Candidate(#[codec(compact)] u32), +} + +/// Information needed to prove the defunct-ness of a voter. +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug)] +pub struct DefunctVoter { + /// the voter's who's being challenged for being defunct + pub who: AccountId, + /// The number of votes that `who` has placed. + #[codec(compact)] + pub vote_count: u32, + /// The number of current active candidates. + #[codec(compact)] + pub candidate_count: u32 +} + pub trait Trait: frame_system::Trait { /// The overarching event type.c type Event: From> + Into<::Event>; @@ -239,10 +269,16 @@ decl_error! { RunnerSubmit, /// Candidate does not have enough funds. InsufficientCandidateFunds, - /// Origin is not a candidate, member or a runner up. - InvalidOrigin, /// Not a member. NotMember, + /// The provided count of number of candidates is incorrect. + InvalidCandidateCount, + /// The provided count of number of votes is incorrect. + InvalidVoteCount, + /// The renouncing origin presented a wrong `Renouncing` parameter. + InvalidRenouncing, + /// Prediction regarding replacement after member removal is wrong. + InvalidReplacement, } } @@ -259,46 +295,60 @@ decl_module! { const TermDuration: T::BlockNumber = T::TermDuration::get(); const ModuleId: LockIdentifier = T::ModuleId::get(); - /// Vote for a set of candidates for the upcoming round of election. + /// Vote for a set of candidates for the upcoming round of election. This can be called to + /// set the initial votes, or update already existing votes. + /// + /// Upon initial voting, `value` units of `who`'s balance is locked and a bond amount is + /// reserved. /// /// The `votes` should: /// - not be empty. - /// - be less than the number of candidates. + /// - be less than the number of possible candidates. Note that all current members and + /// runners-up are also automatically candidates for the next round. /// - /// Upon voting, `value` units of `who`'s balance is locked and a bond amount is reserved. /// It is the responsibility of the caller to not place all of their balance into the lock /// and keep some for further transactions. /// /// # - /// #### State - /// Reads: O(1) - /// Writes: O(V) given `V` votes. V is bounded by 16. + /// Base weight: 47.93 µs + /// State reads: + /// - Candidates.len() + Members.len() + RunnersUp.len() + /// - Voting (is_voter) + /// - [AccountBalance(who) (unreserve + total_balance)] + /// State writes: + /// - Voting + /// - Lock + /// - [AccountBalance(who) (unreserve -- only when creating a new voter)] /// # - #[weight = 100_000_000] - fn vote(origin, votes: Vec, #[compact] value: BalanceOf) { + #[weight = 50 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(4, 2)] + fn vote( + origin, + votes: Vec, + #[compact] value: BalanceOf, + ) { let who = ensure_signed(origin)?; + ensure!(votes.len() <= MAXIMUM_VOTE, Error::::MaximumVotesExceeded); + ensure!(!votes.is_empty(), Error::::NoVotes); + let candidates_count = >::decode_len().unwrap_or(0); let members_count = >::decode_len().unwrap_or(0); let runners_up_count = >::decode_len().unwrap_or(0); + // addition is valid: candidates, members and runners-up will never overlap. let allowed_votes = candidates_count + members_count + runners_up_count; ensure!(!allowed_votes.is_zero(), Error::::UnableToVote); ensure!(votes.len() <= allowed_votes, Error::::TooManyVotes); - ensure!(votes.len() <= MAXIMUM_VOTE, Error::::MaximumVotesExceeded); - ensure!(!votes.is_empty(), Error::::NoVotes); - ensure!( - value > T::Currency::minimum_balance(), - Error::::LowBalance, - ); + ensure!(value > T::Currency::minimum_balance(), Error::::LowBalance); + // first time voter. Reserve bond. if !Self::is_voter(&who) { - // first time voter. Reserve bond. T::Currency::reserve(&who, T::VotingBond::get()) .map_err(|_| Error::::UnableToPayBond)?; } + // Amount to be locked up. let locked_balance = value.min(T::Currency::total_balance(&who)); @@ -316,14 +366,19 @@ decl_module! { /// Remove `origin` as a voter. This removes the lock and returns the bond. /// /// # - /// #### State - /// Reads: O(1) - /// Writes: O(1) + /// Base weight: 36.8 µs + /// All state access is from do_remove_voter. + /// State reads: + /// - Voting + /// - [AccountData(who)] + /// State writes: + /// - Voting + /// - Locks + /// - [AccountData(who)] /// # - #[weight = 0] + #[weight = 35 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(1, 2)] fn remove_voter(origin) { let who = ensure_signed(origin)?; - ensure!(Self::is_voter(&who), Error::::MustBeVoter); Self::do_remove_voter(&who, true); @@ -335,27 +390,62 @@ decl_module! { /// /// A defunct voter is defined to be: /// - a voter whose current submitted votes are all invalid. i.e. all of them are no - /// longer a candidate nor an active member. + /// longer a candidate nor an active member or a runner-up. + /// + /// + /// The origin must provide the number of current candidates and votes of the reported target + /// for the purpose of accurate weight calculation. /// /// # - /// #### State - /// Reads: O(NLogM) given M current candidates and N votes for `target`. - /// Writes: O(1) + /// No Base weight based on min square analysis. + /// Complexity of candidate_count: 1.755 µs + /// Complexity of vote_count: 18.51 µs + /// State reads: + /// - Voting(reporter) + /// - Candidate.len() + /// - Voting(Target) + /// - Candidates, Members, RunnersUp (is_defunct_voter) + /// State writes: + /// - Lock(reporter || target) + /// - [AccountBalance(reporter)] + AccountBalance(target) + /// - Voting(reporter || target) + /// Note: the db access is worse with respect to db, which is when the report is correct. /// # - #[weight = 1_000_000_000] - fn report_defunct_voter(origin, target: ::Source) { + #[weight = + Weight::from(defunct.candidate_count).saturating_mul(2 * WEIGHT_PER_MICROS) + .saturating_add(Weight::from(defunct.vote_count).saturating_mul(19 * WEIGHT_PER_MICROS)) + .saturating_add(T::DbWeight::get().reads_writes(6, 3)) + ] + fn report_defunct_voter( + origin, + defunct: DefunctVoter<::Source>, + ) { let reporter = ensure_signed(origin)?; - let target = T::Lookup::lookup(target)?; + let target = T::Lookup::lookup(defunct.who)?; ensure!(reporter != target, Error::::ReportSelf); ensure!(Self::is_voter(&reporter), Error::::MustBeVoter); - // Checking if someone is a candidate and a member here is O(LogN), making the whole - // function O(MLonN) with N candidates in total and M of them being voted by `target`. - // We could easily add another mapping to be able to check if someone is a candidate in - // `O(1)` but that would make the process of removing candidates at the end of each - // round slightly harder. Note that for now we have a bound of number of votes (`N`). - let valid = Self::is_defunct_voter(&target); + let DefunctVoter { candidate_count, vote_count, .. } = defunct; + + ensure!( + >::decode_len().unwrap_or(0) as u32 <= candidate_count, + Error::::InvalidCandidateCount, + ); + + let (_, votes) = >::get(&target); + // indirect way to ensure target is a voter. We could call into `::contains()`, but it + // would have the same effect with one extra db access. Note that votes cannot be + // submitted with length 0. Hence, a non-zero length means that the target is a voter. + ensure!(votes.len() > 0, Error::::MustBeVoter); + + // ensure that the size of votes that need to be searched is correct. + ensure!( + votes.len() as u32 <= vote_count, + Error::::InvalidVoteCount, + ); + + let valid = Self::is_defunct_voter(&votes); if valid { // reporter will get the voting bond of the target T::Currency::repatriate_reserved(&target, &reporter, T::VotingBond::get(), BalanceStatus::Free)?; @@ -371,7 +461,6 @@ decl_module! { Self::deposit_event(RawEvent::VoterReported(target, reporter, valid)); } - /// Submit oneself for candidacy. /// /// A candidate will either: @@ -381,21 +470,40 @@ decl_module! { /// removed. /// /// # - /// #### State - /// Reads: O(LogN) Given N candidates. - /// Writes: O(1) + /// Base weight = 33.33 µs + /// Complexity of candidate_count: 0.375 µs + /// State reads: + /// - Candidates.len() + /// - Candidates + /// - Members + /// - RunnersUp + /// - [AccountBalance(who)] + /// State writes: + /// - [AccountBalance(who)] + /// - Candidates /// # - #[weight = 500_000_000] - fn submit_candidacy(origin) { + #[weight = + (35 * WEIGHT_PER_MICROS) + .saturating_add(Weight::from(*candidate_count).saturating_mul(375 * WEIGHT_PER_NANOS)) + .saturating_add(T::DbWeight::get().reads_writes(4, 1)) + ] + fn submit_candidacy(origin, #[compact] candidate_count: u32) { let who = ensure_signed(origin)?; + let actual_count = >::decode_len().unwrap_or(0); + ensure!( + actual_count as u32 <= candidate_count, + Error::::InvalidCandidateCount, + ); + let is_candidate = Self::is_candidate(&who); ensure!(is_candidate.is_err(), Error::::DuplicatedCandidate); + // assured to be an error, error always contains the index. let index = is_candidate.unwrap_err(); ensure!(!Self::is_member(&who), Error::::MemberSubmit); - ensure!(!Self::is_runner(&who), Error::::RunnerSubmit); + ensure!(!Self::is_runner_up(&who), Error::::RunnerSubmit); T::Currency::reserve(&who, T::CandidacyBond::get()) .map_err(|_| Error::::InsufficientCandidateFunds)?; @@ -407,55 +515,93 @@ decl_module! { /// outcomes exist: /// - `origin` is a candidate and not elected in any set. In this case, the bond is /// unreserved, returned and origin is removed as a candidate. - /// - `origin` is a current runner up. In this case, the bond is unreserved, returned and - /// origin is removed as a runner. + /// - `origin` is a current runner-up. In this case, the bond is unreserved, returned and + /// origin is removed as a runner-up. /// - `origin` is a current member. In this case, the bond is unreserved and origin is /// removed as a member, consequently not being a candidate for the next round anymore. /// Similar to [`remove_voter`], if replacement runners exists, they are immediately used. - #[weight = (2_000_000_000, DispatchClass::Operational)] - fn renounce_candidacy(origin) { - let who = ensure_signed(origin)?; - - // NOTE: this function attempts the 3 conditions (being a candidate, member, runner) and - // fails if none are matched. Unlike other Palette functions and modules where checks - // happen first and then execution happens, this function is written the other way - // around. The main intention is that reading all of the candidates, members and runners - // from storage is expensive. Furthermore, we know (soft proof) that they are always - // mutually exclusive. Hence, we try one, and only then decode more storage. - - if let Ok(_replacement) = Self::remove_and_replace_member(&who) { - T::Currency::unreserve(&who, T::CandidacyBond::get()); - Self::deposit_event(RawEvent::MemberRenounced(who.clone())); - - // safety guard to make sure we do only one arm. Better to read runners later. - return Ok(()); - } - - let mut runners_up_with_stake = Self::runners_up(); - if let Some(index) = runners_up_with_stake.iter() - .position(|(ref r, ref _s)| r == &who) - { - runners_up_with_stake.remove(index); - // unreserve the bond - T::Currency::unreserve(&who, T::CandidacyBond::get()); - // update storage. - >::put(runners_up_with_stake); - // safety guard to make sure we do only one arm. Better to read runners later. - return Ok(()); - } - - let mut candidates = Self::candidates(); - if let Ok(index) = candidates.binary_search(&who) { - candidates.remove(index); - // unreserve the bond - T::Currency::unreserve(&who, T::CandidacyBond::get()); - // update storage. - >::put(candidates); - // safety guard to make sure we do only one arm. Better to read runners later. - return Ok(()); + /// + /// If a candidate is renouncing: + /// Base weight: 17.28 µs + /// Complexity of candidate_count: 0.235 µs + /// State reads: + /// - Candidates + /// - [AccountBalance(who) (unreserve)] + /// State writes: + /// - Candidates + /// - [AccountBalance(who) (unreserve)] + /// If member is renouncing: + /// Base weight: 46.25 µs + /// State reads: + /// - Members, RunnersUp (remove_and_replace_member), + /// - [AccountData(who) (unreserve)] + /// State writes: + /// - Members, RunnersUp (remove_and_replace_member), + /// - [AccountData(who) (unreserve)] + /// If runner is renouncing: + /// Base weight: 46.25 µs + /// State reads: + /// - RunnersUp (remove_and_replace_member), + /// - [AccountData(who) (unreserve)] + /// State writes: + /// - RunnersUp (remove_and_replace_member), + /// - [AccountData(who) (unreserve)] + /// + /// Weight note: The call into changeMembers need to be accounted for. + /// + #[weight = match *renouncing { + Renouncing::Candidate(count) => { + (18 * WEIGHT_PER_MICROS) + .saturating_add(Weight::from(count).saturating_mul(235 * WEIGHT_PER_NANOS)) + .saturating_add(T::DbWeight::get().reads_writes(1, 1)) + }, + Renouncing::Member => { + 46 * WEIGHT_PER_MICROS + + T::DbWeight::get().reads_writes(2, 2) + }, + Renouncing::RunnerUp => { + 46 * WEIGHT_PER_MICROS + + T::DbWeight::get().reads_writes(1, 1) } - - Err(Error::::InvalidOrigin)? + }] + fn renounce_candidacy(origin, renouncing: Renouncing) { + let who = ensure_signed(origin)?; + match renouncing { + Renouncing::Member => { + // returns NoMember error in case of error. + let _ = Self::remove_and_replace_member(&who)?; + T::Currency::unreserve(&who, T::CandidacyBond::get()); + Self::deposit_event(RawEvent::MemberRenounced(who.clone())); + }, + Renouncing::RunnerUp => { + let mut runners_up_with_stake = Self::runners_up(); + if let Some(index) = runners_up_with_stake + .iter() + .position(|(ref r, ref _s)| r == &who) + { + runners_up_with_stake.remove(index); + // unreserve the bond + T::Currency::unreserve(&who, T::CandidacyBond::get()); + // update storage. + >::put(runners_up_with_stake); + } else { + Err(Error::::InvalidRenouncing)?; + } + } + Renouncing::Candidate(count) => { + let mut candidates = Self::candidates(); + ensure!(count >= candidates.len() as u32, Error::::InvalidRenouncing); + if let Some(index) = candidates.iter().position(|x| *x == who) { + candidates.remove(index); + // unreserve the bond + T::Currency::unreserve(&who, T::CandidacyBond::get()); + // update storage. + >::put(candidates); + } else { + Err(Error::::InvalidRenouncing)?; + } + } + }; } /// Remove a particular member from the set. This is effective immediately and the bond of @@ -467,34 +613,57 @@ decl_module! { /// Note that this does not affect the designated block number of the next election. /// /// # - /// #### State - /// Reads: O(do_phragmen) - /// Writes: O(do_phragmen) + /// If we have a replacement: + /// - Base weight: 50.93 µs + /// - State reads: + /// - RunnersUp.len() + /// - Members, RunnersUp (remove_and_replace_member) + /// - State writes: + /// - Members, RunnersUp (remove_and_replace_member) + /// Else, since this is a root call and will go into phragmen, we assume full block for now. /// # - #[weight = (2_000_000_000, DispatchClass::Operational)] - fn remove_member(origin, who: ::Source) -> DispatchResult { + #[weight = if *has_replacement { + 50 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(3, 2) + } else { + T::MaximumBlockWeight::get() + }] + fn remove_member( + origin, + who: ::Source, + has_replacement: bool, + ) -> DispatchResultWithPostInfo { ensure_root(origin)?; let who = T::Lookup::lookup(who)?; + let will_have_replacement = >::decode_len().unwrap_or(0) > 0; + if will_have_replacement != has_replacement { + // In both cases, we will change more weight than neede. Refund and abort. + return Err(Error::::InvalidReplacement.with_weight( + // refund. The weight value comes from a benchmark which is special to this. + // 5.751 µs + 6 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(1, 0) + )); + } // else, prediction was correct. + Self::remove_and_replace_member(&who).map(|had_replacement| { let (imbalance, _) = T::Currency::slash_reserved(&who, T::CandidacyBond::get()); T::KickedMember::on_unbalanced(imbalance); Self::deposit_event(RawEvent::MemberKicked(who.clone())); if !had_replacement { + // if we end up here, we will charge a full block weight. Self::do_phragmen(); } - }) + + // no refund needed. + None.into() + }).map_err(|e| e.into()) } /// What to do at the end of each block. Checks if an election needs to happen or not. fn on_initialize(n: T::BlockNumber) -> Weight { - if let Err(e) = Self::end_block(n) { - print("Guru meditation"); - print(e); - } - - 0 + // returns the correct weight. + Self::end_block(n) } } } @@ -524,13 +693,19 @@ decl_event!( ); impl Module { - /// Attempts to remove a member `who`. If a runner up exists, it is used as the replacement. + /// Attempts to remove a member `who`. If a runner-up exists, it is used as the replacement and + /// Ok(true). is returned. + /// /// Otherwise, `Ok(false)` is returned to signal the caller. /// - /// In both cases, [`Members`], [`ElectionRounds`] and [`RunnersUp`] storage are updated - /// accordingly. Furthermore, the membership change is reported. + /// If a replacement exists, `Members` and `RunnersUp` storage is updated, where the first + /// element of `RunnersUp` is used as the replacement and `Ok(true)` is returned. Else, + /// `Ok(false)` is returned with no storage updated. /// - /// O(phragmen) in the worse case. + /// Note that this function _will_ call into `T::ChangeMembers` in case any change happens + /// (`Ok(true)`). + /// + /// If replacement exists, this will read and write from/into both `Members` and `RunnersUp`. fn remove_and_replace_member(who: &T::AccountId) -> Result { let mut members_with_stake = Self::members(); if let Ok(index) = members_with_stake.binary_search_by(|(ref m, ref _s)| m.cmp(who)) { @@ -563,7 +738,7 @@ impl Module { /// Check if `who` is a candidate. It returns the insert index if the element does not exists as /// an error. /// - /// State: O(LogN) given N candidates. + /// O(LogN) given N candidates. fn is_candidate(who: &T::AccountId) -> Result<(), usize> { Self::candidates().binary_search(who).map(|_| ()) } @@ -577,15 +752,15 @@ impl Module { /// Check if `who` is currently an active member. /// - /// Limited number of members. Binary search. Constant time factor. O(1) + /// O(LogN) given N members. Since members are limited, O(1). fn is_member(who: &T::AccountId) -> bool { Self::members().binary_search_by(|(a, _b)| a.cmp(who)).is_ok() } - /// Check if `who` is currently an active runner. + /// Check if `who` is currently an active runner-up. /// - /// Limited number of runners-up. Binary search. Constant time factor. O(1) - fn is_runner(who: &T::AccountId) -> bool { + /// O(LogN) given N runners-up. Since runners-up are limited, O(1). + fn is_runner_up(who: &T::AccountId) -> bool { Self::runners_up().iter().position(|(a, _b)| a == who).is_some() } @@ -614,25 +789,24 @@ impl Module { Self::runners_up().into_iter().map(|(r, _)| r).collect::>() } - /// Check if `who` is a defunct voter. - /// - /// Note that false is returned if `who` is not a voter at all. + /// Check if `votes` will correspond to a defunct voter. As no origin is part of the inputs, + /// this function does not check the origin at all. /// /// O(NLogM) with M candidates and `who` having voted for `N` of them. - fn is_defunct_voter(who: &T::AccountId) -> bool { - if Self::is_voter(who) { - Self::votes_of(who) - .iter() - .all(|v| !Self::is_member(v) && !Self::is_runner(v) && !Self::is_candidate(v).is_ok()) - } else { - false - } + /// Reads Members, RunnersUp, Candidates and Voting(who) from database. + fn is_defunct_voter(votes: &[T::AccountId]) -> bool { + votes.iter().all(|v| + !Self::is_member(v) && !Self::is_runner_up(v) && !Self::is_candidate(v).is_ok() + ) } /// Remove a certain someone as a voter. /// /// This will clean always clean the storage associated with the voter, and remove the balance /// lock. Optionally, it would also return the reserved voting bond if indicated by `unreserve`. + /// If unreserve is true, has 3 storage reads and 1 reads. + /// + /// DB access: Voting and Lock are always written to, if unreserve, then 1 read and write added. fn do_remove_voter(who: &T::AccountId, unreserve: bool) { // remove storage and lock. Voting::::remove(who); @@ -648,22 +822,18 @@ impl Module { Voting::::get(who).0 } - /// The locked stake of a voter. - fn votes_of(who: &T::AccountId) -> Vec { - Voting::::get(who).1 - } - /// Check there's nothing to do this block. /// /// Runs phragmen election and cleans all the previous candidate state. The voter state is NOT /// cleaned and voters must themselves submit a transaction to retract. - fn end_block(block_number: T::BlockNumber) -> DispatchResult { + fn end_block(block_number: T::BlockNumber) -> Weight { if !Self::term_duration().is_zero() { if (block_number % Self::term_duration()).is_zero() { Self::do_phragmen(); + return T::MaximumBlockWeight::get() } } - Ok(()) + 0 } /// Run the phragmen election with all required side processes and state updates. @@ -882,11 +1052,13 @@ impl ContainsLengthBound for Module { mod tests { use super::*; use std::cell::RefCell; - use frame_support::{assert_ok, assert_noop, parameter_types, weights::Weight}; + use frame_support::{assert_ok, assert_noop, assert_err_with_weight, parameter_types, + weights::Weight, + }; use substrate_test_utils::assert_eq_uvec; use sp_core::H256; use sp_runtime::{ - Perbill, testing::Header, BuildStorage, + Perbill, testing::Header, BuildStorage, DispatchResult, traits::{BlakeTwo256, IdentityLookup, Block as BlockT}, }; use crate as elections_phragmen; @@ -1001,7 +1173,7 @@ mod tests { new_plus_outgoing.extend_from_slice(outgoing); new_plus_outgoing.sort(); - assert_eq!(old_plus_incoming, new_plus_outgoing); + assert_eq!(old_plus_incoming, new_plus_outgoing, "change members call is incorrect!"); MEMBERS.with(|m| *m.borrow_mut() = new.to_vec()); PRIME.with(|p| *p.borrow_mut() = None); @@ -1065,6 +1237,7 @@ mod tests { voter_bond: u64, term_duration: u64, desired_runners_up: u32, + desired_members: u32, } impl Default for ExtBuilder { @@ -1073,8 +1246,9 @@ mod tests { genesis_members: vec![], balance_factor: 1, voter_bond: 2, - desired_runners_up: 0, term_duration: 5, + desired_runners_up: 0, + desired_members: 2, } } } @@ -1096,15 +1270,24 @@ mod tests { self.genesis_members = members; self } + #[cfg(feature = "runtime-benchmarks")] + pub fn desired_members(mut self, count: u32) -> Self { + self.desired_members = count; + self + } pub fn balance_factor(mut self, factor: u64) -> Self { self.balance_factor = factor; self } - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + fn set_constants(&self) { VOTING_BOND.with(|v| *v.borrow_mut() = self.voter_bond); TERM_DURATION.with(|v| *v.borrow_mut() = self.term_duration); DESIRED_RUNNERS_UP.with(|v| *v.borrow_mut() = self.desired_runners_up); + DESIRED_MEMBERS.with(|m| *m.borrow_mut() = self.desired_members); MEMBERS.with(|m| *m.borrow_mut() = self.genesis_members.iter().map(|(m, _)| m.clone()).collect::>()); + } + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + self.set_constants(); let mut ext: sp_io::TestExternalities = GenesisConfig { pallet_balances: Some(pallet_balances::GenesisConfig::{ balances: vec![ @@ -1186,6 +1369,33 @@ mod tests { ensure_members_has_approval_stake(); } + fn submit_candidacy(origin: Origin) -> DispatchResult { + Elections::submit_candidacy(origin, Elections::candidates().len() as u32) + } + + fn vote(origin: Origin, votes: Vec, stake: u64) -> DispatchResult { + // historical note: helper function was created in a period of time in which the API of vote + // call was changing. Currently it is a wrapper for the original call and does not do much. + // Nonetheless, totally harmless. + if let Origin::system(frame_system::RawOrigin::Signed(_account)) = origin { + Elections::vote(origin, votes, stake) + } else { + panic!("vote origin must be signed"); + } + } + + fn votes_of(who: &u64) -> Vec { + Voting::::get(who).1 + } + + fn defunct_for(who: u64) -> DefunctVoter { + DefunctVoter { + who, + candidate_count: Elections::candidates().len() as u32, + vote_count: votes_of(&who).len() as u32 + } + } + #[test] fn params_should_work() { ExtBuilder::default().build_and_execute(|| { @@ -1201,7 +1411,7 @@ mod tests { assert!(Elections::is_candidate(&1).is_err()); assert_eq!(all_voters(), vec![]); - assert_eq!(Elections::votes_of(&1), vec![]); + assert_eq!(votes_of(&1), vec![]); }); } @@ -1216,7 +1426,7 @@ mod tests { // they will persist since they have self vote. System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![1, 2]); }) @@ -1233,7 +1443,7 @@ mod tests { // they will persist since they have self vote. System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![1, 2]); }) @@ -1281,7 +1491,7 @@ mod tests { assert_eq!(Elections::candidates(), vec![]); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![]); assert_eq!(Elections::runners_up(), vec![]); @@ -1297,7 +1507,7 @@ mod tests { assert!(Elections::is_candidate(&2).is_err()); assert_eq!(balances(&1), (10, 0)); - assert_ok!(Elections::submit_candidacy(Origin::signed(1))); + assert_ok!(submit_candidacy(Origin::signed(1))); assert_eq!(balances(&1), (7, 3)); assert_eq!(Elections::candidates(), vec![1]); @@ -1306,7 +1516,7 @@ mod tests { assert!(Elections::is_candidate(&2).is_err()); assert_eq!(balances(&2), (20, 0)); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(2))); assert_eq!(balances(&2), (17, 3)); assert_eq!(Elections::candidates(), vec![1, 2]); @@ -1321,8 +1531,8 @@ mod tests { ExtBuilder::default().build_and_execute(|| { assert_eq!(Elections::candidates(), Vec::::new()); - assert_ok!(Elections::submit_candidacy(Origin::signed(1))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(1))); + assert_ok!(submit_candidacy(Origin::signed(2))); assert!(Elections::is_candidate(&1).is_ok()); assert!(Elections::is_candidate(&2).is_ok()); @@ -1332,7 +1542,7 @@ mod tests { assert_eq!(Elections::runners_up(), vec![]); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert!(Elections::is_candidate(&1).is_err()); assert!(Elections::is_candidate(&2).is_err()); @@ -1347,10 +1557,10 @@ mod tests { fn dupe_candidate_submission_should_not_work() { ExtBuilder::default().build_and_execute(|| { assert_eq!(Elections::candidates(), Vec::::new()); - assert_ok!(Elections::submit_candidacy(Origin::signed(1))); + assert_ok!(submit_candidacy(Origin::signed(1))); assert_eq!(Elections::candidates(), vec![1]); assert_noop!( - Elections::submit_candidacy(Origin::signed(1)), + submit_candidacy(Origin::signed(1)), Error::::DuplicatedCandidate, ); }); @@ -1360,18 +1570,18 @@ mod tests { fn member_candidacy_submission_should_not_work() { // critically important to make sure that outgoing candidates and losers are not mixed up. ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![5]); assert_eq!(Elections::runners_up(), vec![]); assert_eq!(Elections::candidates(), vec![]); assert_noop!( - Elections::submit_candidacy(Origin::signed(5)), + submit_candidacy(Origin::signed(5)), Error::::MemberSubmit, ); }); @@ -1380,21 +1590,21 @@ mod tests { #[test] fn runner_candidate_submission_should_not_work() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5, 4], 20)); - assert_ok!(Elections::vote(Origin::signed(1), vec![3], 10)); + assert_ok!(vote(Origin::signed(2), vec![5, 4], 20)); + assert_ok!(vote(Origin::signed(1), vec![3], 10)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::runners_up_ids(), vec![3]); assert_noop!( - Elections::submit_candidacy(Origin::signed(3)), + submit_candidacy(Origin::signed(3)), Error::::RunnerSubmit, ); }); @@ -1405,7 +1615,7 @@ mod tests { ExtBuilder::default().build_and_execute(|| { assert_eq!(Elections::candidates(), Vec::::new()); assert_noop!( - Elections::submit_candidacy(Origin::signed(7)), + submit_candidacy(Origin::signed(7)), Error::::InsufficientCandidateFunds, ); }); @@ -1417,8 +1627,8 @@ mod tests { assert_eq!(Elections::candidates(), Vec::::new()); assert_eq!(balances(&2), (20, 0)); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); assert_eq!(balances(&2), (18, 2)); assert_eq!(has_lock(&2), 20); @@ -1431,8 +1641,8 @@ mod tests { assert_eq!(Elections::candidates(), Vec::::new()); assert_eq!(balances(&2), (20, 0)); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 12)); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(vote(Origin::signed(2), vec![5], 12)); assert_eq!(balances(&2), (18, 2)); assert_eq!(has_lock(&2), 12); @@ -1444,16 +1654,16 @@ mod tests { ExtBuilder::default().build_and_execute(|| { assert_eq!(balances(&2), (20, 0)); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); assert_eq!(balances(&2), (18, 2)); assert_eq!(has_lock(&2), 20); assert_eq!(Elections::locked_stake_of(&2), 20); // can update; different stake; different lock and reserve. - assert_ok!(Elections::vote(Origin::signed(2), vec![5, 4], 15)); + assert_ok!(vote(Origin::signed(2), vec![5, 4], 15)); assert_eq!(balances(&2), (18, 2)); assert_eq!(has_lock(&2), 15); assert_eq!(Elections::locked_stake_of(&2), 15); @@ -1464,8 +1674,8 @@ mod tests { fn cannot_vote_for_no_candidate() { ExtBuilder::default().build_and_execute(|| { assert_noop!( - Elections::vote(Origin::signed(2), vec![], 20), - Error::::UnableToVote, + vote(Origin::signed(2), vec![], 20), + Error::::NoVotes, ); }); } @@ -1473,41 +1683,41 @@ mod tests { #[test] fn can_vote_for_old_members_even_when_no_new_candidates() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(2), vec![4, 5], 20)); + assert_ok!(vote(Origin::signed(2), vec![4, 5], 20)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::candidates(), vec![]); - assert_ok!(Elections::vote(Origin::signed(3), vec![4, 5], 10)); + assert_ok!(vote(Origin::signed(3), vec![4, 5], 10)); }); } #[test] fn prime_works() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(1), vec![4, 3], 10)); - assert_ok!(Elections::vote(Origin::signed(2), vec![4], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(1), vec![4, 3], 10)); + assert_ok!(vote(Origin::signed(2), vec![4], 20)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::candidates(), vec![]); - assert_ok!(Elections::vote(Origin::signed(3), vec![4, 5], 10)); + assert_ok!(vote(Origin::signed(3), vec![4, 5], 10)); assert_eq!(PRIME.with(|p| *p.borrow()), Some(4)); }); } @@ -1515,20 +1725,20 @@ mod tests { #[test] fn prime_votes_for_exiting_members_are_removed() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(1), vec![4, 3], 10)); - assert_ok!(Elections::vote(Origin::signed(2), vec![4], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(1), vec![4, 3], 10)); + assert_ok!(vote(Origin::signed(2), vec![4], 20)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::renounce_candidacy(Origin::signed(4))); + assert_ok!(Elections::renounce_candidacy(Origin::signed(4), Renouncing::Candidate(3))); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![3, 5]); assert_eq!(Elections::candidates(), vec![]); @@ -1545,29 +1755,29 @@ mod tests { .build_and_execute( || { // when we have only candidates - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); assert_noop!( // content of the vote is irrelevant. - Elections::vote(Origin::signed(1), vec![9, 99, 999, 9999], 5), + vote(Origin::signed(1), vec![9, 99, 999, 9999], 5), Error::::TooManyVotes, ); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // now we have 2 members, 1 runner-up, and 1 new candidate - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(1), vec![9, 99, 999, 9999], 5)); + assert_ok!(vote(Origin::signed(1), vec![9, 99, 999, 9999], 5)); assert_noop!( - Elections::vote(Origin::signed(1), vec![9, 99, 999, 9_999, 99_999], 5), + vote(Origin::signed(1), vec![9, 99, 999, 9_999, 99_999], 5), Error::::TooManyVotes, ); }); @@ -1576,11 +1786,11 @@ mod tests { #[test] fn cannot_vote_for_less_than_ed() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); assert_noop!( - Elections::vote(Origin::signed(2), vec![4], 1), + vote(Origin::signed(2), vec![4], 1), Error::::LowBalance, ); }) @@ -1589,10 +1799,10 @@ mod tests { #[test] fn can_vote_for_more_than_total_balance_but_moot() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(2), vec![4, 5], 30)); + assert_ok!(vote(Origin::signed(2), vec![4, 5], 30)); // you can lie but won't get away with it. assert_eq!(Elections::locked_stake_of(&2), 20); assert_eq!(has_lock(&2), 20); @@ -1602,21 +1812,21 @@ mod tests { #[test] fn remove_voter_should_work() { ExtBuilder::default().voter_bond(8).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![5], 30)); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); + assert_ok!(vote(Origin::signed(3), vec![5], 30)); assert_eq_uvec!(all_voters(), vec![2, 3]); assert_eq!(Elections::locked_stake_of(&2), 20); assert_eq!(Elections::locked_stake_of(&3), 30); - assert_eq!(Elections::votes_of(&2), vec![5]); - assert_eq!(Elections::votes_of(&3), vec![5]); + assert_eq!(votes_of(&2), vec![5]); + assert_eq!(votes_of(&3), vec![5]); assert_ok!(Elections::remove_voter(Origin::signed(2))); assert_eq_uvec!(all_voters(), vec![3]); - assert_eq!(Elections::votes_of(&2), vec![]); + assert_eq!(votes_of(&2), vec![]); assert_eq!(Elections::locked_stake_of(&2), 0); assert_eq!(balances(&2), (20, 0)); @@ -1634,8 +1844,8 @@ mod tests { #[test] fn dupe_remove_should_fail() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); assert_ok!(Elections::remove_voter(Origin::signed(2))); assert_eq!(all_voters(), vec![]); @@ -1647,18 +1857,18 @@ mod tests { #[test] fn removed_voter_should_not_be_counted() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); assert_ok!(Elections::remove_voter(Origin::signed(4))); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![3, 5]); }); @@ -1668,47 +1878,102 @@ mod tests { fn reporter_must_be_voter() { ExtBuilder::default().build_and_execute(|| { assert_noop!( - Elections::report_defunct_voter(Origin::signed(1), 2), + Elections::report_defunct_voter(Origin::signed(1), defunct_for(2)), Error::::MustBeVoter, ); }); } + #[test] + fn reporter_must_provide_lengths() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + + // both are defunct. + assert_ok!(vote(Origin::signed(5), vec![99, 999, 9999], 50)); + assert_ok!(vote(Origin::signed(4), vec![999], 40)); + + // 3 candidates! incorrect candidate length. + assert_noop!( + Elections::report_defunct_voter(Origin::signed(4), DefunctVoter { + who: 5, + candidate_count: 2, + vote_count: 3, + }), + Error::::InvalidCandidateCount, + ); + + // 3 votes! incorrect vote length + assert_noop!( + Elections::report_defunct_voter(Origin::signed(4), DefunctVoter { + who: 5, + candidate_count: 3, + vote_count: 2, + }), + Error::::InvalidVoteCount, + ); + + // correct. + assert_ok!(Elections::report_defunct_voter(Origin::signed(4), DefunctVoter { + who: 5, + candidate_count: 3, + vote_count: 3, + })); + }); + } + + #[test] + fn reporter_can_overestimate_length() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + + // both are defunct. + assert_ok!(vote(Origin::signed(5), vec![99], 50)); + assert_ok!(vote(Origin::signed(4), vec![999], 40)); + + // 2 candidates! overestimation is okay. + assert_ok!(Elections::report_defunct_voter(Origin::signed(4), defunct_for(5))); + }); + } + #[test] fn can_detect_defunct_voter() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(6))); - - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(2), vec![4, 5], 20)); - assert_ok!(Elections::vote(Origin::signed(6), vec![6], 30)); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(6))); + + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(2), vec![4, 5], 20)); + assert_ok!(vote(Origin::signed(6), vec![6], 30)); // will be soon a defunct voter. - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::runners_up_ids(), vec![6]); assert_eq!(Elections::candidates(), vec![]); // all of them have a member or runner-up that they voted for. - assert_eq!(Elections::is_defunct_voter(&5), false); - assert_eq!(Elections::is_defunct_voter(&4), false); - assert_eq!(Elections::is_defunct_voter(&2), false); - assert_eq!(Elections::is_defunct_voter(&6), false); + assert_eq!(Elections::is_defunct_voter(&votes_of(&5)), false); + assert_eq!(Elections::is_defunct_voter(&votes_of(&4)), false); + assert_eq!(Elections::is_defunct_voter(&votes_of(&2)), false); + assert_eq!(Elections::is_defunct_voter(&votes_of(&6)), false); // defunct - assert_eq!(Elections::is_defunct_voter(&3), true); + assert_eq!(Elections::is_defunct_voter(&votes_of(&3)), true); - assert_ok!(Elections::submit_candidacy(Origin::signed(1))); - assert_ok!(Elections::vote(Origin::signed(1), vec![1], 10)); + assert_ok!(submit_candidacy(Origin::signed(1))); + assert_ok!(vote(Origin::signed(1), vec![1], 10)); // has a candidate voted for. - assert_eq!(Elections::is_defunct_voter(&1), false); + assert_eq!(Elections::is_defunct_voter(&votes_of(&1)), false); }); } @@ -1716,17 +1981,17 @@ mod tests { #[test] fn report_voter_should_work_and_earn_reward() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(2), vec![4, 5], 20)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(2), vec![4, 5], 20)); // will be soon a defunct voter. - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::candidates(), vec![]); @@ -1734,7 +1999,7 @@ mod tests { assert_eq!(balances(&3), (28, 2)); assert_eq!(balances(&5), (45, 5)); - assert_ok!(Elections::report_defunct_voter(Origin::signed(5), 3)); + assert_ok!(Elections::report_defunct_voter(Origin::signed(5), defunct_for(3))); assert!(System::events().iter().any(|event| { event.event == Event::elections_phragmen(RawEvent::VoterReported(3, 5, true)) })); @@ -1747,14 +2012,14 @@ mod tests { #[test] fn report_voter_should_slash_when_bad_report() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::candidates(), vec![]); @@ -1762,7 +2027,7 @@ mod tests { assert_eq!(balances(&4), (35, 5)); assert_eq!(balances(&5), (45, 5)); - assert_ok!(Elections::report_defunct_voter(Origin::signed(5), 4)); + assert_ok!(Elections::report_defunct_voter(Origin::signed(5), defunct_for(4))); assert!(System::events().iter().any(|event| { event.event == Event::elections_phragmen(RawEvent::VoterReported(4, 5, false)) })); @@ -1775,19 +2040,19 @@ mod tests { #[test] fn simple_voting_rounds_should_work() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 15)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); + assert_ok!(vote(Origin::signed(4), vec![4], 15)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); assert_eq_uvec!(all_voters(), vec![2, 3, 4]); - assert_eq!(Elections::votes_of(&2), vec![5]); - assert_eq!(Elections::votes_of(&3), vec![3]); - assert_eq!(Elections::votes_of(&4), vec![4]); + assert_eq!(votes_of(&2), vec![5]); + assert_eq!(votes_of(&3), vec![3]); + assert_eq!(votes_of(&4), vec![4]); assert_eq!(Elections::candidates(), vec![3, 4, 5]); assert_eq!(>::decode_len().unwrap(), 3); @@ -1795,7 +2060,7 @@ mod tests { assert_eq!(Elections::election_rounds(), 0); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members(), vec![(3, 30), (5, 20)]); assert_eq!(Elections::runners_up(), vec![]); @@ -1810,23 +2075,23 @@ mod tests { #[test] fn defunct_voter_will_be_counted() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(5))); // This guy's vote is pointless for this round. - assert_ok!(Elections::vote(Origin::signed(3), vec![4], 30)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(3), vec![4], 30)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members(), vec![(5, 50)]); assert_eq!(Elections::election_rounds(), 1); // but now it has a valid target. - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(4))); System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // candidate 4 is affected by an old vote. assert_eq!(Elections::members(), vec![(4, 30), (5, 50)]); @@ -1838,18 +2103,18 @@ mod tests { #[test] fn only_desired_seats_are_chosen() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::election_rounds(), 1); assert_eq!(Elections::members_ids(), vec![4, 5]); @@ -1859,11 +2124,11 @@ mod tests { #[test] fn phragmen_should_not_self_vote() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::candidates(), vec![]); assert_eq!(Elections::election_rounds(), 1); @@ -1879,18 +2144,18 @@ mod tests { #[test] fn runners_up_should_be_kept() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![3], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![2], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![5], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![4], 50)); + assert_ok!(vote(Origin::signed(2), vec![3], 20)); + assert_ok!(vote(Origin::signed(3), vec![2], 30)); + assert_ok!(vote(Origin::signed(4), vec![5], 40)); + assert_ok!(vote(Origin::signed(5), vec![4], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // sorted based on account id. assert_eq!(Elections::members_ids(), vec![4, 5]); // sorted based on merit (least -> most) @@ -1906,25 +2171,25 @@ mod tests { #[test] fn runners_up_should_be_next_candidates() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members(), vec![(4, 40), (5, 50)]); assert_eq!(Elections::runners_up(), vec![(2, 20), (3, 30)]); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 15)); + assert_ok!(vote(Origin::signed(5), vec![5], 15)); System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members(), vec![(3, 30), (4, 40)]); assert_eq!(Elections::runners_up(), vec![(5, 15), (2, 20)]); }); @@ -1933,25 +2198,25 @@ mod tests { #[test] fn runners_up_lose_bond_once_outgoing() { ExtBuilder::default().desired_runners_up(1).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::runners_up_ids(), vec![2]); assert_eq!(balances(&2), (15, 5)); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::runners_up_ids(), vec![3]); assert_eq!(balances(&2), (15, 2)); @@ -1963,21 +2228,21 @@ mod tests { ExtBuilder::default().build_and_execute(|| { assert_eq!(balances(&5), (50, 0)); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(5))); assert_eq!(balances(&5), (47, 3)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); assert_eq!(balances(&5), (45, 5)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![5]); assert_ok!(Elections::remove_voter(Origin::signed(5))); assert_eq!(balances(&5), (47, 3)); System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![]); assert_eq!(balances(&5), (47, 0)); @@ -1987,16 +2252,16 @@ mod tests { #[test] fn losers_will_lose_the_bond() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(4), vec![5], 40)); + assert_ok!(vote(Origin::signed(4), vec![5], 40)); assert_eq!(balances(&5), (47, 3)); assert_eq!(balances(&3), (27, 3)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![5]); @@ -2010,23 +2275,23 @@ mod tests { #[test] fn current_members_are_always_next_candidate() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::election_rounds(), 1); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + assert_ok!(submit_candidacy(Origin::signed(2))); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); assert_ok!(Elections::remove_voter(Origin::signed(4))); @@ -2034,7 +2299,7 @@ mod tests { assert_eq!(Elections::candidates(), vec![2, 3]); System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // 4 removed; 5 and 3 are the new best. assert_eq!(Elections::members_ids(), vec![3, 5]); @@ -2046,19 +2311,19 @@ mod tests { // what I mean by uninterrupted: // given no input or stimulants the same members are re-elected. ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); let check_at_block = |b: u32| { System::set_block_number(b.into()); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // we keep re-electing the same folks. assert_eq!(Elections::members(), vec![(4, 40), (5, 50)]); assert_eq!(Elections::runners_up(), vec![(2, 20), (3, 30)]); @@ -2079,22 +2344,22 @@ mod tests { #[test] fn remove_members_triggers_election() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::election_rounds(), 1); // a new candidate - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::remove_member(Origin::ROOT, 4)); + assert_ok!(Elections::remove_member(Origin::ROOT, 4, false)); assert_eq!(balances(&4), (35, 2)); // slashed assert_eq!(Elections::election_rounds(), 2); // new election round @@ -2102,24 +2367,68 @@ mod tests { }); } + #[test] + fn remove_member_should_indicate_replacement() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + + System::set_block_number(5); + Elections::end_block(System::block_number()); + assert_eq!(Elections::members_ids(), vec![4, 5]); + + // no replacement yet. + assert_err_with_weight!( + Elections::remove_member(Origin::ROOT, 4, true), + Error::::InvalidReplacement, + Some(6000000), + ); + }); + + ExtBuilder::default().desired_runners_up(1).build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + + System::set_block_number(5); + Elections::end_block(System::block_number()); + assert_eq!(Elections::members_ids(), vec![4, 5]); + assert_eq!(Elections::runners_up_ids(), vec![3]); + + // there is a replacement! and this one needs a weight refund. + assert_err_with_weight!( + Elections::remove_member(Origin::ROOT, 4, false), + Error::::InvalidReplacement, + Some(6000000) // only thing that matters for now is that it is NOT the full block. + ); + }); + } + #[test] fn seats_should_be_released_when_no_vote() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(2), vec![3], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(2), vec![3], 20)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); assert_eq!(>::decode_len().unwrap(), 3); assert_eq!(Elections::election_rounds(), 0); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![3, 5]); assert_eq!(Elections::election_rounds(), 1); @@ -2130,7 +2439,7 @@ mod tests { // meanwhile, no one cares to become a candidate again. System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![]); assert_eq!(Elections::election_rounds(), 2); }); @@ -2139,32 +2448,32 @@ mod tests { #[test] fn incoming_outgoing_are_reported() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); - assert_ok!(Elections::submit_candidacy(Origin::signed(1))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(1))); + assert_ok!(submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(3))); // 5 will change their vote and becomes an `outgoing` - assert_ok!(Elections::vote(Origin::signed(5), vec![4], 8)); + assert_ok!(vote(Origin::signed(5), vec![4], 8)); // 4 will stay in the set - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); // 3 will become a winner - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); // these two are losers. - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); - assert_ok!(Elections::vote(Origin::signed(1), vec![1], 10)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(1), vec![1], 10)); System::set_block_number(10); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // 3, 4 are new members, must still be bonded, nothing slashed. assert_eq!(Elections::members(), vec![(3, 30), (4, 48)]); @@ -2186,15 +2495,15 @@ mod tests { #[test] fn invalid_votes_are_moot() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![10], 50)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![10], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq_uvec!(Elections::members_ids(), vec![3, 4]); assert_eq!(Elections::election_rounds(), 1); @@ -2204,18 +2513,18 @@ mod tests { #[test] fn members_are_sorted_based_on_id_runners_on_merit() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![3], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![2], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![5], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![4], 50)); + assert_ok!(vote(Origin::signed(2), vec![3], 20)); + assert_ok!(vote(Origin::signed(3), vec![2], 30)); + assert_ok!(vote(Origin::signed(4), vec![5], 40)); + assert_ok!(vote(Origin::signed(5), vec![4], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); // id: low -> high. assert_eq!(Elections::members(), vec![(4, 50), (5, 40)]); // merit: low -> high. @@ -2226,14 +2535,14 @@ mod tests { #[test] fn candidates_are_sorted() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(3))); assert_eq!(Elections::candidates(), vec![3, 5]); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::renounce_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(Elections::renounce_candidacy(Origin::signed(3), Renouncing::Candidate(4))); assert_eq!(Elections::candidates(), vec![2, 4, 5]); }) @@ -2242,64 +2551,43 @@ mod tests { #[test] fn runner_up_replacement_maintains_members_order() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![2], 50)); + assert_ok!(vote(Origin::signed(2), vec![5], 20)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![2], 50)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![2, 4]); - assert_ok!(Elections::remove_member(Origin::ROOT, 2)); + assert_ok!(Elections::remove_member(Origin::ROOT, 2, true)); assert_eq!(Elections::members_ids(), vec![4, 5]); }); } - #[test] - fn runner_up_replacement_works_when_out_of_order() { - ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); - - assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(5), vec![2], 50)); - - System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); - - assert_eq!(Elections::members_ids(), vec![2, 4]); - assert_ok!(Elections::renounce_candidacy(Origin::signed(3))); - }); - } - #[test] fn can_renounce_candidacy_member_with_runners_bond_is_refunded() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::runners_up_ids(), vec![2, 3]); - assert_ok!(Elections::renounce_candidacy(Origin::signed(4))); + assert_ok!(Elections::renounce_candidacy(Origin::signed(4), Renouncing::Member)); assert_eq!(balances(&4), (38, 2)); // 2 is voting bond. assert_eq!(Elections::members_ids(), vec![3, 5]); @@ -2310,55 +2598,47 @@ mod tests { #[test] fn can_renounce_candidacy_member_without_runners_bond_is_refunded() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::vote(Origin::signed(5), vec![5], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); - - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::runners_up_ids(), vec![]); - assert_eq!(Elections::candidates(), vec![2, 3]); - assert_ok!(Elections::renounce_candidacy(Origin::signed(4))); + assert_ok!(Elections::renounce_candidacy(Origin::signed(4), Renouncing::Member)); assert_eq!(balances(&4), (38, 2)); // 2 is voting bond. // no replacement assert_eq!(Elections::members_ids(), vec![5]); assert_eq!(Elections::runners_up_ids(), vec![]); - // still candidate - assert_eq!(Elections::candidates(), vec![2, 3]); }) } #[test] fn can_renounce_candidacy_runner() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); - assert_ok!(Elections::submit_candidacy(Origin::signed(4))); - assert_ok!(Elections::submit_candidacy(Origin::signed(3))); - assert_ok!(Elections::submit_candidacy(Origin::signed(2))); + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + assert_ok!(submit_candidacy(Origin::signed(2))); - assert_ok!(Elections::vote(Origin::signed(5), vec![4], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![5], 40)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(5), vec![4], 50)); + assert_ok!(vote(Origin::signed(4), vec![5], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![4, 5]); assert_eq!(Elections::runners_up_ids(), vec![2, 3]); - assert_ok!(Elections::renounce_candidacy(Origin::signed(3))); + assert_ok!(Elections::renounce_candidacy(Origin::signed(3), Renouncing::RunnerUp)); assert_eq!(balances(&3), (28, 2)); // 2 is voting bond. assert_eq!(Elections::members_ids(), vec![4, 5]); @@ -2366,14 +2646,38 @@ mod tests { }) } + // #[test] + // fn runner_up_replacement_works_when_out_of_order() { + // ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { + // assert_ok!(submit_candidacy(Origin::signed(5))); + // assert_ok!(submit_candidacy(Origin::signed(4))); + // assert_ok!(submit_candidacy(Origin::signed(3))); + // assert_ok!(submit_candidacy(Origin::signed(2))); + + // assert_ok!(vote(Origin::signed(2), vec![5], 20)); + // assert_ok!(vote(Origin::signed(3), vec![3], 30)); + // assert_ok!(vote(Origin::signed(4), vec![4], 40)); + // assert_ok!(vote(Origin::signed(5), vec![2], 50)); + + // System::set_block_number(5); + // Elections::end_block(System::block_number()); + + // assert_eq!(Elections::members_ids(), vec![2, 4]); + // assert_eq!(ELections::runners_up_ids(), vec![3, 5]); + // assert_ok!(Elections::renounce_candidacy(Origin::signed(3), Renouncing::RunnerUp)); + // assert_eq!(Elections::members_ids(), vec![2, 4]); + // assert_eq!(ELections::runners_up_ids(), vec![5]); + // }); + // } + #[test] fn can_renounce_candidacy_candidate() { ExtBuilder::default().build_and_execute(|| { - assert_ok!(Elections::submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(5))); assert_eq!(balances(&5), (47, 3)); assert_eq!(Elections::candidates(), vec![5]); - assert_ok!(Elections::renounce_candidacy(Origin::signed(5))); + assert_ok!(Elections::renounce_candidacy(Origin::signed(5), Renouncing::Candidate(1))); assert_eq!(balances(&5), (50, 0)); assert_eq!(Elections::candidates(), vec![]); }) @@ -2383,25 +2687,107 @@ mod tests { fn wrong_renounce_candidacy_should_fail() { ExtBuilder::default().build_and_execute(|| { assert_noop!( - Elections::renounce_candidacy(Origin::signed(5)), - Error::::InvalidOrigin, + Elections::renounce_candidacy(Origin::signed(5), Renouncing::Candidate(0)), + Error::::InvalidRenouncing, + ); + assert_noop!( + Elections::renounce_candidacy(Origin::signed(5), Renouncing::Member), + Error::::NotMember, + ); + assert_noop!( + Elections::renounce_candidacy(Origin::signed(5), Renouncing::RunnerUp), + Error::::InvalidRenouncing, + ); + }) + } + + #[test] + fn non_member_renounce_member_should_fail() { + ExtBuilder::default().desired_runners_up(1).build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + + System::set_block_number(5); + Elections::end_block(System::block_number()); + + assert_eq!(Elections::members_ids(), vec![4, 5]); + assert_eq!(Elections::runners_up_ids(), vec![3]); + + assert_noop!( + Elections::renounce_candidacy(Origin::signed(3), Renouncing::Member), + Error::::NotMember, ); }) } + #[test] + fn non_runner_up_renounce_runner_up_should_fail() { + ExtBuilder::default().desired_runners_up(1).build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + + assert_ok!(vote(Origin::signed(5), vec![5], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + + System::set_block_number(5); + Elections::end_block(System::block_number()); + + assert_eq!(Elections::members_ids(), vec![4, 5]); + assert_eq!(Elections::runners_up_ids(), vec![3]); + + assert_noop!( + Elections::renounce_candidacy(Origin::signed(4), Renouncing::RunnerUp), + Error::::InvalidRenouncing, + ); + }) + } + + #[test] + fn wrong_candidate_count_renounce_should_fail() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + + assert_noop!( + Elections::renounce_candidacy(Origin::signed(4), Renouncing::Candidate(2)), + Error::::InvalidRenouncing, + ); + + assert_ok!(Elections::renounce_candidacy(Origin::signed(4), Renouncing::Candidate(3))); + }) + } + + #[test] + fn renounce_candidacy_count_can_overestimate() { + ExtBuilder::default().build_and_execute(|| { + assert_ok!(submit_candidacy(Origin::signed(5))); + assert_ok!(submit_candidacy(Origin::signed(4))); + assert_ok!(submit_candidacy(Origin::signed(3))); + // while we have only 3 candidates. + assert_ok!(Elections::renounce_candidacy(Origin::signed(4), Renouncing::Candidate(4))); + }) + } + #[test] fn behavior_with_dupe_candidate() { ExtBuilder::default().desired_runners_up(2).build_and_execute(|| { - // TODD: this is a demonstration and should be fixed with #4593 >::put(vec![1, 1, 2, 3, 4]); - assert_ok!(Elections::vote(Origin::signed(5), vec![1], 50)); - assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40)); - assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30)); - assert_ok!(Elections::vote(Origin::signed(2), vec![2], 20)); + assert_ok!(vote(Origin::signed(5), vec![1], 50)); + assert_ok!(vote(Origin::signed(4), vec![4], 40)); + assert_ok!(vote(Origin::signed(3), vec![3], 30)); + assert_ok!(vote(Origin::signed(2), vec![2], 20)); System::set_block_number(5); - assert_ok!(Elections::end_block(System::block_number())); + Elections::end_block(System::block_number()); assert_eq!(Elections::members_ids(), vec![1, 4]); assert_eq!(Elections::runners_up_ids(), vec![2, 3]); diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index a05561173b..11109fb177 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -214,7 +214,20 @@ macro_rules! assert_err { #[cfg(feature = "std")] macro_rules! assert_err_ignore_postinfo { ( $x:expr , $y:expr $(,)? ) => { - assert_err!($x.map(|_| ()).map_err(|e| e.error), $y); + $crate::assert_err!($x.map(|_| ()).map_err(|e| e.error), $y); + } +} + +#[macro_export] +#[cfg(feature = "std")] +macro_rules! assert_err_with_weight { + ($call:expr, $err:expr, $weight:expr $(,)? ) => { + if let Err(dispatch_err_with_post) = $call { + $crate::assert_err!($call.map(|_| ()).map_err(|e| e.error), $err); + assert_eq!(dispatch_err_with_post.post_info.actual_weight, $weight.into()); + } else { + panic!("expected Err(_), got Ok(_).") + } } } diff --git a/frame/timestamp/src/benchmarking.rs b/frame/timestamp/src/benchmarking.rs index fd2d285698..9b1c976229 100644 --- a/frame/timestamp/src/benchmarking.rs +++ b/frame/timestamp/src/benchmarking.rs @@ -35,6 +35,7 @@ benchmarks! { set { let t in 1 .. MAX_TIME; }: _(RawOrigin::None, t.into()) + verify { ensure!(Timestamp::::now() == t.into(), "Time was not set."); } @@ -44,6 +45,7 @@ benchmarks! { Timestamp::::set(RawOrigin::None.into(), t.into())?; ensure!(DidUpdate::exists(), "Time was not set."); }: { Timestamp::::on_finalize(t.into()); } + verify { ensure!(!DidUpdate::exists(), "Time was not removed."); } diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 41181ff439..361da3ee57 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -374,16 +374,16 @@ impl From for DispatchOutcome { } } -/// This is the legacy return type of `Dispatchable`. It is still exposed for compatibilty -/// reasons. The new return type is `DispatchResultWithInfo`. -/// FRAME runtimes should use frame_support::dispatch::DispatchResult +/// This is the legacy return type of `Dispatchable`. It is still exposed for compatibility reasons. +/// The new return type is `DispatchResultWithInfo`. FRAME runtimes should use +/// `frame_support::dispatch::DispatchResult`. pub type DispatchResult = sp_std::result::Result<(), DispatchError>; /// Return type of a `Dispatchable` which contains the `DispatchResult` and additional information /// about the `Dispatchable` that is only known post dispatch. pub type DispatchResultWithInfo = sp_std::result::Result>; -/// Reason why a dispatch call failed +/// Reason why a dispatch call failed. #[derive(Eq, PartialEq, Clone, Copy, Encode, Decode, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Serialize))] pub enum DispatchError { @@ -393,11 +393,11 @@ pub enum DispatchError { CannotLookup, /// A bad origin. BadOrigin, - /// A custom error in a module + /// A custom error in a module. Module { - /// Module index, matching the metadata module index + /// Module index, matching the metadata module index. index: u8, - /// Module specific error value + /// Module specific error value. error: u8, /// Optional error message. #[codec(skip)] @@ -405,15 +405,15 @@ pub enum DispatchError { }, } -/// Result of a `Dispatchable` which contains the `DispatchResult` and additional information -/// about the `Dispatchable` that is only known post dispatch. +/// Result of a `Dispatchable` which contains the `DispatchResult` and additional information about +/// the `Dispatchable` that is only known post dispatch. #[derive(Eq, PartialEq, Clone, Copy, Encode, Decode, RuntimeDebug)] pub struct DispatchErrorWithPostInfo where Info: Eq + PartialEq + Clone + Copy + Encode + Decode + traits::Printable { - /// Addditional information about the `Dispatchable` which is only known post dispatch. + /// Additional information about the `Dispatchable` which is only known post dispatch. pub post_info: Info, - /// The actual `DispatchResult` indicating whether the dispatch was succesfull. + /// The actual `DispatchResult` indicating whether the dispatch was successful. pub error: DispatchError, } -- GitLab From 82ec8edf2cbbf2c69aa2961dc846ebb2f5884124 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Fri, 15 May 2020 17:03:52 +0200 Subject: [PATCH 058/150] Use `sign_with` in consensus (#6008) * Add derive_more to sp_core * Convert Vec to Signature * Use sign_with in AURA and BABE * Signing errors * Update slots to return consensus result * Fix use * Clone public key * Match block_params * WIP * Use to_public_crypto_pair * Pass public key only to block import params * Address PR review * Fix consensus RPC * Fix babe tests * adjust uses * Fix line widths --- Cargo.lock | 2 + client/consensus/aura/src/lib.rs | 60 +++++++++++++++--------- client/consensus/babe/rpc/src/lib.rs | 7 ++- client/consensus/babe/src/authorship.rs | 12 ++--- client/consensus/babe/src/lib.rs | 35 ++++++++++---- client/consensus/babe/src/tests.rs | 2 +- client/consensus/slots/Cargo.toml | 1 + client/consensus/slots/src/lib.rs | 17 ++++--- primitives/application-crypto/src/lib.rs | 14 +++++- primitives/consensus/common/src/error.rs | 7 ++- primitives/core/Cargo.toml | 1 + primitives/core/src/traits.rs | 7 ++- 12 files changed, 115 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4dc8ac49b..0ea154b8df 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6247,6 +6247,7 @@ dependencies = [ "sc-client-api", "sc-telemetry", "sp-api", + "sp-application-crypto", "sp-blockchain", "sp-consensus", "sp-core", @@ -7464,6 +7465,7 @@ dependencies = [ "blake2-rfc", "byteorder 1.3.4", "criterion 0.2.11", + "derive_more", "ed25519-dalek", "futures 0.3.4", "hash-db", diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 826758203c..e95aedfab2 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -32,7 +32,7 @@ #![forbid(missing_docs, unsafe_code)] use std::{ sync::Arc, time::Duration, thread, marker::PhantomData, hash::Hash, fmt::Debug, pin::Pin, - collections::HashMap + collections::HashMap, convert::{TryFrom, TryInto}, }; use futures::prelude::*; @@ -54,11 +54,15 @@ use sp_blockchain::{ ProvideCache, HeaderBackend, }; use sp_block_builder::BlockBuilder as BlockBuilderApi; -use sp_runtime::{generic::{BlockId, OpaqueDigestItemId}, Justification}; +use sp_core::crypto::Public; +use sp_application_crypto::{AppKey, AppPublic}; +use sp_runtime::{ + generic::{BlockId, OpaqueDigestItemId}, + Justification, +}; use sp_runtime::traits::{Block as BlockT, Header, DigestItemFor, Zero, Member}; use sp_api::ProvideRuntimeApi; - -use sp_core::crypto::Pair; +use sp_core::{traits::BareCryptoStore, crypto::Pair}; use sp_inherents::{InherentDataProviders, InherentData}; use sp_timestamp::{ TimestampInherentData, InherentType as TimestampInherent, InherentError as TIError @@ -152,8 +156,8 @@ pub fn start_aura( E: Environment + Send + Sync + 'static, E::Proposer: Proposer>, P: Pair + Send + Sync, - P::Public: Hash + Member + Encode + Decode, - P::Signature: Hash + Member + Encode + Decode, + P::Public: AppPublic + Hash + Member + Encode + Decode, + P::Signature: TryFrom> + Hash + Member + Encode + Decode, I: BlockImport> + Send + Sync + 'static, Error: std::error::Error + Send + From + 'static, SO: SyncOracle + Send + Sync + Clone, @@ -201,8 +205,8 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW E::Proposer: Proposer>, I: BlockImport> + Send + Sync + 'static, P: Pair + Send + Sync, - P::Public: Member + Encode + Decode + Hash, - P::Signature: Member + Encode + Decode + Hash + Debug, + P::Public: AppPublic + Public + Member + Encode + Decode + Hash, + P::Signature: TryFrom> + Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From + 'static, { @@ -212,7 +216,7 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW dyn Future> + Send + 'static >>; type Proposer = E::Proposer; - type Claim = P; + type Claim = P::Public; type EpochData = Vec>; fn logging_target(&self) -> &'static str { @@ -241,12 +245,7 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW slot_number: u64, epoch_data: &Self::EpochData, ) -> Option { - let expected_author = slot_author::

(slot_number, epoch_data); - - expected_author.and_then(|p| { - self.keystore.read() - .key_pair_by_type::

(&p, sp_application_crypto::key_types::AURA).ok() - }) + slot_author::

(slot_number, epoch_data).cloned() } fn pre_digest_data( @@ -266,11 +265,30 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW StorageChanges, B>, Self::Claim, Self::EpochData, - ) -> sp_consensus::BlockImportParams> + Send> { - Box::new(|header, header_hash, body, storage_changes, pair, _epoch| { + ) -> Result< + sp_consensus::BlockImportParams>, + sp_consensus::Error> + Send + 'static> + { + let keystore = self.keystore.clone(); + Box::new(move |header, header_hash, body, storage_changes, public, _epoch| { // sign the pre-sealed hash of the block and then // add it to a digest item. - let signature = pair.sign(header_hash.as_ref()); + let public_type_pair = public.to_public_crypto_pair(); + let public = public.to_raw_vec(); + let signature = keystore.read() + .sign_with( + as AppKey>::ID, + &public_type_pair, + header_hash.as_ref() + ) + .map_err(|e| sp_consensus::Error::CannotSign( + public.clone(), e.to_string(), + ))?; + let signature = signature.clone().try_into() + .map_err(|_| sp_consensus::Error::InvalidSignature( + signature, public + ))?; + let signature_digest_item = as CompatibleDigestItem

>::aura_seal(signature); let mut import_block = BlockImportParams::new(BlockOrigin::Own, header); @@ -279,7 +297,7 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW import_block.storage_changes = Some(storage_changes); import_block.fork_choice = Some(ForkChoiceStrategy::LongestChain); - import_block + Ok(import_block) }) } @@ -333,8 +351,8 @@ impl SlotWorker for AuraWorker>, I: BlockImport> + Send + Sync + 'static, P: Pair + Send + Sync, - P::Public: Member + Encode + Decode + Hash, - P::Signature: Member + Encode + Decode + Hash + Debug, + P::Public: AppPublic + Member + Encode + Decode + Hash, + P::Signature: TryFrom> + Member + Encode + Decode + Hash + Debug, SO: SyncOracle + Send + Sync + Clone, Error: std::error::Error + Send + From + 'static, { diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index 384a05353b..395fa8dc4f 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -33,7 +33,6 @@ use sp_consensus_babe::{ use serde::{Deserialize, Serialize}; use sc_keystore::KeyStorePtr; use sp_api::{ProvideRuntimeApi, BlockId}; -use sp_core::crypto::Pair; use sp_runtime::traits::{Block as BlockT, Header as _}; use sp_consensus::{SelectChain, Error as ConsensusError}; use sp_blockchain::{HeaderBackend, HeaderMetadata, Error as BlockChainError}; @@ -136,13 +135,13 @@ impl BabeApi for BabeRPCHandler { match claim { PreDigest::Primary { .. } => { - claims.entry(key.public()).or_default().primary.push(slot_number); + claims.entry(key).or_default().primary.push(slot_number); } PreDigest::SecondaryPlain { .. } => { - claims.entry(key.public()).or_default().secondary.push(slot_number); + claims.entry(key).or_default().secondary.push(slot_number); } PreDigest::SecondaryVRF { .. } => { - claims.entry(key.public()).or_default().secondary_vrf.push(slot_number); + claims.entry(key).or_default().secondary_vrf.push(slot_number); }, }; } diff --git a/client/consensus/babe/src/authorship.rs b/client/consensus/babe/src/authorship.rs index 584501110b..1a6852c0c1 100644 --- a/client/consensus/babe/src/authorship.rs +++ b/client/consensus/babe/src/authorship.rs @@ -126,7 +126,7 @@ fn claim_secondary_slot( epoch: &Epoch, key_pairs: &[(AuthorityPair, usize)], author_secondary_vrf: bool, -) -> Option<(PreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityId)> { let Epoch { authorities, randomness, epoch_index, .. } = epoch; if authorities.is_empty() { @@ -163,7 +163,7 @@ fn claim_secondary_slot( }) }; - return Some((pre_digest, pair.clone())); + return Some((pre_digest, pair.public())); } } @@ -178,7 +178,7 @@ pub fn claim_slot( slot_number: SlotNumber, epoch: &Epoch, keystore: &KeyStorePtr, -) -> Option<(PreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityId)> { let key_pairs = { let keystore = keystore.read(); epoch.authorities.iter() @@ -197,7 +197,7 @@ pub fn claim_slot_using_key_pairs( slot_number: SlotNumber, epoch: &Epoch, key_pairs: &[(AuthorityPair, usize)], -) -> Option<(PreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityId)> { claim_primary_slot(slot_number, epoch, epoch.config.c, &key_pairs) .or_else(|| { if epoch.config.allowed_slots.is_secondary_plain_slots_allowed() || @@ -229,7 +229,7 @@ fn claim_primary_slot( epoch: &Epoch, c: (u64, u64), key_pairs: &[(AuthorityPair, usize)], -) -> Option<(PreDigest, AuthorityPair)> { +) -> Option<(PreDigest, AuthorityId)> { let Epoch { authorities, randomness, epoch_index, .. } = epoch; for (pair, authority_index) in key_pairs { @@ -254,7 +254,7 @@ fn claim_primary_slot( // early exit on first successful claim if let Some(pre_digest) = pre_digest { - return Some((pre_digest, pair.clone())); + return Some((pre_digest, pair.public())); } } diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index d6498c119b..9c8883baf6 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -76,12 +76,14 @@ pub use sp_consensus_babe::{ pub use sp_consensus::SyncOracle; use std::{ collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}, - any::Any, borrow::Cow + any::Any, borrow::Cow, convert::TryInto, }; use sp_consensus::{ImportResult, CanAuthorWith}; use sp_consensus::import_queue::{ BoxJustificationImport, BoxFinalityProofImport, }; +use sp_core::{crypto::Public, traits::BareCryptoStore}; +use sp_application_crypto::AppKey; use sp_runtime::{ generic::{BlockId, OpaqueDigestItemId}, Justification, traits::{Block as BlockT, Header, DigestItemFor, Zero}, @@ -89,7 +91,6 @@ use sp_runtime::{ use sp_api::{ProvideRuntimeApi, NumberFor}; use sc_keystore::KeyStorePtr; use parking_lot::Mutex; -use sp_core::Pair; use sp_inherents::{InherentDataProviders, InherentData}; use sc_telemetry::{telemetry, CONSENSUS_TRACE, CONSENSUS_DEBUG}; use sp_consensus::{ @@ -440,7 +441,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork Error: std::error::Error + Send + From + From + 'static, { type EpochData = ViableEpochDescriptor, Epoch>; - type Claim = (PreDigest, AuthorityPair); + type Claim = (PreDigest, AuthorityId); type SyncOracle = SO; type CreateProposer = Pin> + Send + 'static @@ -517,12 +518,30 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork StorageChanges, Self::Claim, Self::EpochData, - ) -> sp_consensus::BlockImportParams + Send> { - Box::new(|header, header_hash, body, storage_changes, (_, pair), epoch_descriptor| { + ) -> Result< + sp_consensus::BlockImportParams, + sp_consensus::Error> + Send + 'static> + { + let keystore = self.keystore.clone(); + Box::new(move |header, header_hash, body, storage_changes, (_, public), epoch_descriptor| { // sign the pre-sealed hash of the block and then // add it to a digest item. - let signature = pair.sign(header_hash.as_ref()); - let digest_item = as CompatibleDigestItem>::babe_seal(signature); + let public_type_pair = public.clone().into(); + let public = public.to_raw_vec(); + let signature = keystore.read() + .sign_with( + ::ID, + &public_type_pair, + header_hash.as_ref() + ) + .map_err(|e| sp_consensus::Error::CannotSign( + public.clone(), e.to_string(), + ))?; + let signature: AuthoritySignature = signature.clone().try_into() + .map_err(|_| sp_consensus::Error::InvalidSignature( + signature, public + ))?; + let digest_item = as CompatibleDigestItem>::babe_seal(signature.into()); let mut import_block = BlockImportParams::new(BlockOrigin::Own, header); import_block.post_digests.push(digest_item); @@ -533,7 +552,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork Box::new(BabeIntermediate:: { epoch_descriptor }) as Box, ); - import_block + Ok(import_block) }) } diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index f933251d18..774cc5b7a4 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -21,7 +21,7 @@ #![allow(deprecated)] use super::*; use authorship::claim_slot; - +use sp_core::crypto::Pair; use sp_consensus_babe::{AuthorityPair, SlotNumber, AllowedSlots}; use sc_block_builder::{BlockBuilder, BlockBuilderProvider}; use sp_consensus::{ diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index 3ea7473029..f778cbf2f0 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -16,6 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0" } sc-client-api = { version = "2.0.0-dev", path = "../../api" } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index 611e0fbb7b..f58e52da41 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -121,11 +121,10 @@ pub trait SimpleSlotWorker { StorageChanges<>::Transaction, B>, Self::Claim, Self::EpochData, - ) -> sp_consensus::BlockImportParams< - B, - >::Transaction - > - + Send + ) -> Result< + sp_consensus::BlockImportParams>::Transaction>, + sp_consensus::Error + > + Send + 'static >; /// Whether to force authoring if offline. @@ -273,7 +272,7 @@ pub trait SimpleSlotWorker { let block_import = self.block_import(); let logging_target = self.logging_target(); - Box::pin(proposal_work.map_ok(move |(proposal, claim)| { + Box::pin(proposal_work.and_then(move |(proposal, claim)| { let (header, body) = proposal.block.deconstruct(); let header_num = *header.number(); let header_hash = header.hash(); @@ -288,6 +287,11 @@ pub trait SimpleSlotWorker { epoch_data, ); + let block_import_params = match block_import_params { + Ok(params) => params, + Err(e) => return future::err(e), + }; + info!( "🔖 Pre-sealed block for proposal at {}. Hash now {:?}, previously {:?}.", header_num, @@ -312,6 +316,7 @@ pub trait SimpleSlotWorker { "hash" => ?parent_hash, "err" => ?err, ); } + future::ready(Ok(())) })) } } diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index 2e244b4212..ebc6068bb3 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -34,7 +34,11 @@ pub use codec; #[cfg(feature = "std")] pub use serde; #[doc(hidden)] -pub use sp_std::{ops::Deref, vec::Vec}; +pub use sp_std::{ + convert::TryFrom, + ops::Deref, + vec::Vec, +}; pub mod ed25519; pub mod sr25519; @@ -457,6 +461,14 @@ macro_rules! app_crypto_signature_common { impl $crate::AppSignature for Signature { type Generic = $sig; } + + impl $crate::TryFrom<$crate::Vec> for Signature { + type Error = (); + + fn try_from(data: $crate::Vec) -> Result { + Ok(<$sig>::try_from(data.as_slice())?.into()) + } + } } } diff --git a/primitives/consensus/common/src/error.rs b/primitives/consensus/common/src/error.rs index 5e4dde80ba..0da7495890 100644 --- a/primitives/consensus/common/src/error.rs +++ b/primitives/consensus/common/src/error.rs @@ -17,7 +17,7 @@ //! Error types in Consensus use sp_version::RuntimeVersion; -use sp_core::ed25519::{Public, Signature}; +use sp_core::ed25519::Public; use std::error; /// Result type alias. @@ -49,7 +49,7 @@ pub enum Error { CannotPropose, /// Error checking signature #[display(fmt="Message signature {:?} by {:?} is invalid.", _0, _1)] - InvalidSignature(Signature, Public), + InvalidSignature(Vec, Vec), /// Invalid authorities set received from the runtime. #[display(fmt="Current state of blockchain has invalid authorities set")] InvalidAuthoritiesSet, @@ -80,6 +80,9 @@ pub enum Error { #[display(fmt="Chain lookup failed: {}", _0)] #[from(ignore)] ChainLookup(String), + /// Signing failed + #[display(fmt="Failed to sign using key: {:?}. Reason: {}", _0, _1)] + CannotSign(Vec, String) } impl error::Error for Error { diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index d0da1d533a..d028141d3d 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -13,6 +13,7 @@ documentation = "https://docs.rs/sp-core" targets = ["x86_64-unknown-linux-gnu"] [dependencies] +derive_more = "0.99.2" sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } log = { version = "0.4.8", default-features = false } diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index b768e0def8..f93f316401 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -32,17 +32,22 @@ use std::{ pub use sp_externalities::{Externalities, ExternalitiesExt}; /// BareCryptoStore error -#[derive(Debug)] +#[derive(Debug, derive_more::Display)] pub enum BareCryptoStoreError { /// Public key type is not supported + #[display(fmt="Key not supported: {:?}", _0)] KeyNotSupported(KeyTypeId), /// Pair not found for public key and KeyTypeId + #[display(fmt="Pair was not found: {}", _0)] PairNotFound(String), /// Validation error + #[display(fmt="Validation error: {}", _0)] ValidationError(String), /// Keystore unavailable + #[display(fmt="Keystore unavailable")] Unavailable, /// Programming errors + #[display(fmt="An unknown keystore error occurred: {}", _0)] Other(String) } -- GitLab From 61a72486dfcfc09dd2ea6265bcd406dc8406d5ac Mon Sep 17 00:00:00 2001 From: satellitex Date: Sat, 16 May 2020 00:04:38 +0900 Subject: [PATCH 059/150] Added RuntimePublic for ecdsa public key. (#6029) * add generate ecdsa, etc to keystore * impl ecdsa needed traits * add ecdsa to sr_io * add ecdsa to application-crypto * add ecdsa to test-utils * add ecdsa debug derive * fix ecdsa public --- client/keystore/src/lib.rs | 33 +++++++- primitives/application-crypto/src/ecdsa.rs | 61 +++++++++++++++ primitives/application-crypto/src/lib.rs | 1 + .../application-crypto/test/src/ecdsa.rs | 42 ++++++++++ primitives/application-crypto/test/src/lib.rs | 4 +- primitives/core/src/ecdsa.rs | 37 +++++++-- primitives/core/src/testing.rs | 50 +++++++++++- primitives/core/src/traits.rs | 14 +++- primitives/io/src/batch_verifier.rs | 25 +++++- primitives/io/src/lib.rs | 76 ++++++++++++++++++- test-utils/runtime/src/lib.rs | 35 ++++++++- 11 files changed, 364 insertions(+), 14 deletions(-) create mode 100644 primitives/application-crypto/src/ecdsa.rs create mode 100644 primitives/application-crypto/test/src/ecdsa.rs diff --git a/client/keystore/src/lib.rs b/client/keystore/src/lib.rs index f8bc930971..6510bb8232 100644 --- a/client/keystore/src/lib.rs +++ b/client/keystore/src/lib.rs @@ -23,7 +23,7 @@ use sp_core::{ traits::{BareCryptoStore, BareCryptoStoreError as TraitError}, Encode, }; -use sp_application_crypto::{AppKey, AppPublic, AppPair, ed25519, sr25519}; +use sp_application_crypto::{AppKey, AppPublic, AppPair, ed25519, sr25519, ecdsa}; use parking_lot::RwLock; /// Keystore pointer @@ -308,6 +308,7 @@ impl BareCryptoStore for Store { .fold(Vec::new(), |mut v, k| { v.push(CryptoTypePublicPair(sr25519::CRYPTO_ID, k.clone())); v.push(CryptoTypePublicPair(ed25519::CRYPTO_ID, k.clone())); + v.push(CryptoTypePublicPair(ecdsa::CRYPTO_ID, k.clone())); v })) } @@ -343,6 +344,13 @@ impl BareCryptoStore for Store { .key_pair_by_type::(&pub_key, id) .map_err(|e| TraitError::from(e))?; Ok(key_pair.sign(msg).encode()) + }, + ecdsa::CRYPTO_ID => { + let pub_key = ecdsa::Public::from_slice(key.1.as_slice()); + let key_pair: ecdsa::Pair = self + .key_pair_by_type::(&pub_key, id) + .map_err(|e| TraitError::from(e))?; + Ok(key_pair.sign(msg).encode()) } _ => Err(TraitError::KeyNotSupported(id)) } @@ -394,6 +402,29 @@ impl BareCryptoStore for Store { Ok(pair.public()) } + fn ecdsa_public_keys(&self, key_type: KeyTypeId) -> Vec { + self.raw_public_keys(key_type) + .map(|v| { + v.into_iter() + .map(|k| ecdsa::Public::from_slice(k.as_slice())) + .collect() + }) + .unwrap_or_default() + } + + fn ecdsa_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> std::result::Result { + let pair = match seed { + Some(seed) => self.insert_ephemeral_from_seed_by_type::(seed, id), + None => self.generate_by_type::(id), + }.map_err(|e| -> TraitError { e.into() })?; + + Ok(pair.public()) + } + fn insert_unknown(&mut self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> std::result::Result<(), ()> { diff --git a/primitives/application-crypto/src/ecdsa.rs b/primitives/application-crypto/src/ecdsa.rs new file mode 100644 index 0000000000..287ac8f3af --- /dev/null +++ b/primitives/application-crypto/src/ecdsa.rs @@ -0,0 +1,61 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Ecdsa crypto types. + +use crate::{RuntimePublic, KeyTypeId}; + +use sp_std::vec::Vec; + +pub use sp_core::ecdsa::*; + +mod app { + use sp_core::testing::ECDSA; + + crate::app_crypto!(super, ECDSA); + + impl crate::traits::BoundToRuntimeAppPublic for Public { + type Public = Self; + } +} + +pub use app::{Public as AppPublic, Signature as AppSignature}; +#[cfg(feature = "full_crypto")] +pub use app::Pair as AppPair; + +impl RuntimePublic for Public { + type Signature = Signature; + + fn all(key_type: KeyTypeId) -> crate::Vec { + sp_io::crypto::ecdsa_public_keys(key_type) + } + + fn generate_pair(key_type: KeyTypeId, seed: Option>) -> Self { + sp_io::crypto::ecdsa_generate(key_type, seed) + } + + fn sign>(&self, key_type: KeyTypeId, msg: &M) -> Option { + sp_io::crypto::ecdsa_sign(key_type, self, msg.as_ref()) + } + + fn verify>(&self, msg: &M, signature: &Self::Signature) -> bool { + sp_io::crypto::ecdsa_verify(&signature, msg.as_ref(), self) + } + + fn to_raw_vec(&self) -> Vec { + sp_core::crypto::Public::to_raw_vec(self) + } +} diff --git a/primitives/application-crypto/src/lib.rs b/primitives/application-crypto/src/lib.rs index ebc6068bb3..6b5cf8857f 100644 --- a/primitives/application-crypto/src/lib.rs +++ b/primitives/application-crypto/src/lib.rs @@ -42,6 +42,7 @@ pub use sp_std::{ pub mod ed25519; pub mod sr25519; +pub mod ecdsa; mod traits; pub use traits::*; diff --git a/primitives/application-crypto/test/src/ecdsa.rs b/primitives/application-crypto/test/src/ecdsa.rs new file mode 100644 index 0000000000..9b5619b7c1 --- /dev/null +++ b/primitives/application-crypto/test/src/ecdsa.rs @@ -0,0 +1,42 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Integration tests for ecdsa + +use sp_runtime::generic::BlockId; +use sp_core::{ + crypto::Pair, + testing::{KeyStore, ECDSA}, +}; +use substrate_test_runtime_client::{ + TestClientBuilder, DefaultTestClientBuilderExt, TestClientBuilderExt, + runtime::TestAPI, +}; +use sp_api::ProvideRuntimeApi; +use sp_application_crypto::ecdsa::{AppPair, AppPublic}; + +#[test] +fn ecdsa_works_in_runtime() { + let keystore = KeyStore::new(); + let test_client = TestClientBuilder::new().set_keystore(keystore.clone()).build(); + let (signature, public) = test_client.runtime_api() + .test_ecdsa_crypto(&BlockId::Number(0)) + .expect("Tests `ecdsa` crypto."); + + let supported_keys = keystore.read().keys(ECDSA).unwrap(); + assert!(supported_keys.contains(&public.clone().into())); + assert!(AppPair::verify(&signature, "ecdsa", &AppPublic::from(public))); +} diff --git a/primitives/application-crypto/test/src/lib.rs b/primitives/application-crypto/test/src/lib.rs index 5ff528cee4..b785392396 100644 --- a/primitives/application-crypto/test/src/lib.rs +++ b/primitives/application-crypto/test/src/lib.rs @@ -20,4 +20,6 @@ #[cfg(test)] mod ed25519; #[cfg(test)] -mod sr25519; \ No newline at end of file +mod sr25519; +#[cfg(test)] +mod ecdsa; diff --git a/primitives/core/src/ecdsa.rs b/primitives/core/src/ecdsa.rs index c5aba0bb40..29fa9a9c5c 100644 --- a/primitives/core/src/ecdsa.rs +++ b/primitives/core/src/ecdsa.rs @@ -38,6 +38,7 @@ use crate::crypto::Ss58Codec; #[cfg(feature = "std")] use serde::{de, Serializer, Serialize, Deserializer, Deserialize}; use crate::crypto::{Public as TraitPublic, CryptoTypePublicPair, UncheckedFrom, CryptoType, Derive, CryptoTypeId}; +use sp_runtime_interface::pass_by::PassByInner; #[cfg(feature = "full_crypto")] use secp256k1::{PublicKey, SecretKey}; @@ -51,7 +52,7 @@ pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"ecds"); type Seed = [u8; 32]; /// The ECDSA compressed public key. -#[derive(Clone, Encode, Decode)] +#[derive(Clone, Encode, Decode, PassByInner)] pub struct Public([u8; 33]); impl PartialOrd for Public { @@ -125,6 +126,18 @@ impl TraitPublic for Public { } } +impl From for CryptoTypePublicPair { + fn from(key: Public) -> Self { + (&key).into() + } +} + +impl From<&Public> for CryptoTypePublicPair { + fn from(key: &Public) -> Self { + CryptoTypePublicPair(CRYPTO_ID, key.to_raw_vec()) + } +} + impl Derive for Public {} impl Default for Public { @@ -178,12 +191,17 @@ impl std::fmt::Display for Public { } } -#[cfg(feature = "std")] -impl std::fmt::Debug for Public { +impl sp_std::fmt::Debug for Public { + #[cfg(feature = "std")] fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let s = self.to_ss58check(); write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8]) } + + #[cfg(not(feature = "std"))] + fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + Ok(()) + } } #[cfg(feature = "std")] @@ -209,7 +227,7 @@ impl sp_std::hash::Hash for Public { } /// A signature (a 512-bit value, plus 8 bits for recovery ID). -#[derive(Encode, Decode)] +#[derive(Encode, Decode, PassByInner)] pub struct Signature([u8; 65]); impl sp_std::convert::TryFrom<&[u8]> for Signature { @@ -289,11 +307,16 @@ impl AsMut<[u8]> for Signature { } } -#[cfg(feature = "std")] -impl std::fmt::Debug for Signature { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { +impl sp_std::fmt::Debug for Signature { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) } + + #[cfg(not(feature = "std"))] + fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + Ok(()) + } } #[cfg(feature = "full_crypto")] diff --git a/primitives/core/src/testing.rs b/primitives/core/src/testing.rs index 73332c6f5b..e14eb6a7f3 100644 --- a/primitives/core/src/testing.rs +++ b/primitives/core/src/testing.rs @@ -21,7 +21,7 @@ use crate::crypto::KeyTypeId; #[cfg(feature = "std")] use crate::{ crypto::{Pair, Public, CryptoTypePublicPair}, - ed25519, sr25519, + ed25519, sr25519, ecdsa, traits::BareCryptoStoreError }; #[cfg(feature = "std")] @@ -30,6 +30,8 @@ use std::collections::HashSet; pub const ED25519: KeyTypeId = KeyTypeId(*b"ed25"); /// Key type for generic Sr 25519 key. pub const SR25519: KeyTypeId = KeyTypeId(*b"sr25"); +/// Key type for generic Sr 25519 key. +pub const ECDSA: KeyTypeId = KeyTypeId(*b"ecds"); /// A keystore implementation usable in tests. #[cfg(feature = "std")] @@ -62,6 +64,14 @@ impl KeyStore { ) } + fn ecdsa_key_pair(&self, id: KeyTypeId, pub_key: &ecdsa::Public) -> Option { + self.keys.get(&id) + .and_then(|inner| + inner.get(pub_key.as_slice()) + .map(|s| ecdsa::Pair::from_string(s, None).expect("`ecdsa` seed slice is valid")) + ) + } + } #[cfg(feature = "std")] @@ -74,6 +84,7 @@ impl crate::traits::BareCryptoStore for KeyStore { .fold(Vec::new(), |mut v, k| { v.push(CryptoTypePublicPair(sr25519::CRYPTO_ID, k.clone())); v.push(CryptoTypePublicPair(ed25519::CRYPTO_ID, k.clone())); + v.push(CryptoTypePublicPair(ecdsa::CRYPTO_ID, k.clone())); v })) }) @@ -142,6 +153,37 @@ impl crate::traits::BareCryptoStore for KeyStore { } } + fn ecdsa_public_keys(&self, id: KeyTypeId) -> Vec { + self.keys.get(&id) + .map(|keys| + keys.values() + .map(|s| ecdsa::Pair::from_string(s, None).expect("`ecdsa` seed slice is valid")) + .map(|p| p.public()) + .collect() + ) + .unwrap_or_default() + } + + fn ecdsa_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result { + match seed { + Some(seed) => { + let pair = ecdsa::Pair::from_string(seed, None) + .map_err(|_| BareCryptoStoreError::ValidationError("Generates an `ecdsa` pair.".to_owned()))?; + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), seed.into()); + Ok(pair.public()) + }, + None => { + let (pair, phrase, _) = ecdsa::Pair::generate_with_phrase(None); + self.keys.entry(id).or_default().insert(pair.public().to_raw_vec(), phrase); + Ok(pair.public()) + } + } + } + fn insert_unknown(&mut self, id: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()> { self.keys.entry(id).or_default().insert(public.to_owned(), suri.to_string()); Ok(()) @@ -187,6 +229,12 @@ impl crate::traits::BareCryptoStore for KeyStore { .ok_or(BareCryptoStoreError::PairNotFound("sr25519".to_owned()))?; return Ok(key_pair.sign(msg).encode()); } + ecdsa::CRYPTO_ID => { + let key_pair: ecdsa::Pair = self + .ecdsa_key_pair(id, &ecdsa::Public::from_slice(key.1.as_slice())) + .ok_or(BareCryptoStoreError::PairNotFound("ecdsa".to_owned()))?; + return Ok(key_pair.sign(msg).encode()); + } _ => Err(BareCryptoStoreError::KeyNotSupported(id)) } } diff --git a/primitives/core/src/traits.rs b/primitives/core/src/traits.rs index f93f316401..880b34a1ed 100644 --- a/primitives/core/src/traits.rs +++ b/primitives/core/src/traits.rs @@ -19,7 +19,7 @@ use crate::{ crypto::{KeyTypeId, CryptoTypePublicPair}, - ed25519, sr25519, + ed25519, sr25519, ecdsa, }; use std::{ @@ -77,6 +77,18 @@ pub trait BareCryptoStore: Send + Sync { id: KeyTypeId, seed: Option<&str>, ) -> Result; + /// Returns all ecdsa public keys for the given key type. + fn ecdsa_public_keys(&self, id: KeyTypeId) -> Vec; + /// Generate a new ecdsa key pair for the given key type and an optional seed. + /// + /// If the given seed is `Some(_)`, the key pair will only be stored in memory. + /// + /// Returns the public key of the generated key pair. + fn ecdsa_generate_new( + &mut self, + id: KeyTypeId, + seed: Option<&str>, + ) -> Result; /// Insert a new key. This doesn't require any known of the crypto; but a public key must be /// manually provided. diff --git a/primitives/io/src/batch_verifier.rs b/primitives/io/src/batch_verifier.rs index 4f10d786e6..6a78070b38 100644 --- a/primitives/io/src/batch_verifier.rs +++ b/primitives/io/src/batch_verifier.rs @@ -17,7 +17,7 @@ //! Batch/parallel verification. -use sp_core::{ed25519, sr25519, crypto::Pair, traits::CloneableSpawn}; +use sp_core::{ed25519, sr25519, ecdsa, crypto::Pair, traits::CloneableSpawn}; use std::sync::{Arc, atomic::{AtomicBool, Ordering as AtomicOrdering}}; use futures::{future::FutureExt, task::FutureObj, channel::oneshot}; @@ -124,6 +124,29 @@ impl BatchVerifier { true } + /// Push ecdsa signature to verify. + /// + /// Returns false if some of the pushed signatures before already failed the check + /// (in this case it won't verify anything else) + pub fn push_ecdsa( + &mut self, + signature: ecdsa::Signature, + pub_key: ecdsa::Public, + message: Vec, + ) -> bool { + if self.invalid.load(AtomicOrdering::Relaxed) { return false; } + + if self.spawn_verification_task(move || ecdsa::Pair::verify(&signature, &message, &pub_key)).is_err() { + log::debug!( + target: "runtime", + "Batch-verification returns false because failed to spawn background task.", + ); + + return false; + } + true + } + fn verify_sr25519_batch(items: Vec) -> bool { let messages = items.iter().map(|item| &item.message[..]).collect(); let signatures = items.iter().map(|item| &item.signature).collect(); diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 0ab811d087..687e01060f 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -42,7 +42,7 @@ use sp_core::{ }; use sp_core::{ - crypto::KeyTypeId, ed25519, sr25519, H256, LogLevel, + crypto::KeyTypeId, ed25519, sr25519, ecdsa, H256, LogLevel, offchain::{ Timestamp, HttpRequestId, HttpRequestStatus, HttpError, StorageKind, OpaqueNetworkState, }, @@ -545,6 +545,80 @@ pub trait Crypto { sr25519::Pair::verify_deprecated(sig, msg, pubkey) } + /// Returns all `ecdsa` public keys for the given key id from the keystore. + fn ecdsa_public_keys(&mut self, id: KeyTypeId) -> Vec { + self.extension::() + .expect("No `keystore` associated for the current context!") + .read() + .ecdsa_public_keys(id) + } + + /// Generate an `ecdsa` key for the given key type using an optional `seed` and + /// store it in the keystore. + /// + /// The `seed` needs to be a valid utf8. + /// + /// Returns the public key. + fn ecdsa_generate(&mut self, id: KeyTypeId, seed: Option>) -> ecdsa::Public { + let seed = seed.as_ref().map(|s| std::str::from_utf8(&s).expect("Seed is valid utf8!")); + self.extension::() + .expect("No `keystore` associated for the current context!") + .write() + .ecdsa_generate_new(id, seed) + .expect("`ecdsa_generate` failed") + } + + /// Sign the given `msg` with the `ecdsa` key that corresponds to the given public key and + /// key type in the keystore. + /// + /// Returns the signature. + fn ecdsa_sign( + &mut self, + id: KeyTypeId, + pub_key: &ecdsa::Public, + msg: &[u8], + ) -> Option { + self.extension::() + .expect("No `keystore` associated for the current context!") + .read() + .sign_with(id, &pub_key.into(), msg) + .map(|sig| ecdsa::Signature::from_slice(sig.as_slice())) + .ok() + } + + /// Verify `ecdsa` signature. + /// + /// Returns `true` when the verification is either successful or batched. + /// If no batching verification extension registered, this will return the result + /// of verification immediately. If batching verification extension is registered + /// caller should call `crypto::finish_batch_verify` to actualy check all submitted + /// signatures. + fn ecdsa_verify( + sig: &ecdsa::Signature, + msg: &[u8], + pub_key: &ecdsa::Public, + ) -> bool { + // TODO: see #5554, this is used outside of externalities context/runtime, thus this manual + // `with_externalities`. + // + // This `with_externalities(..)` block returns Some(Some(result)) if signature verification was successfully + // batched, everything else (Some(None)/None) means it was not batched and needs to be verified. + let evaluated = sp_externalities::with_externalities(|mut instance| + instance.extension::().map( + |extension| extension.push_ecdsa( + sig.clone(), + pub_key.clone(), + msg.to_vec(), + ) + ) + ); + + match evaluated { + Some(Some(val)) => val, + _ => ecdsa::Pair::verify(sig, msg, pub_key), + } + } + /// Verify and recover a SECP256k1 ECDSA signature. /// /// - `sig` is passed in RSV format. V should be either `0/1` or `27/28`. diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 1acb59d0b7..5ac5535a87 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -27,7 +27,7 @@ use sp_std::{prelude::*, marker::PhantomData}; use codec::{Encode, Decode, Input, Error}; use sp_core::{OpaqueMetadata, RuntimeDebug, ChangesTrieConfiguration}; -use sp_application_crypto::{ed25519, sr25519, RuntimeAppPublic}; +use sp_application_crypto::{ed25519, sr25519, ecdsa, RuntimeAppPublic}; use trie_db::{TrieMut, Trie}; use sp_trie::PrefixedMemoryDB; use sp_trie::trie_types::{TrieDB, TrieDBMut}; @@ -305,6 +305,10 @@ cfg_if! { /// /// Returns the signature generated for the message `sr25519`. fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic); + /// Test that `ecdsa` crypto works in the runtime. + /// + /// Returns the signature generated for the message `ecdsa`. + fn test_ecdsa_crypto() -> (ecdsa::AppSignature, ecdsa::AppPublic); /// Run various tests against storage. fn test_storage(); } @@ -347,6 +351,10 @@ cfg_if! { /// /// Returns the signature generated for the message `sr25519`. fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic); + /// Test that `ecdsa` crypto works in the runtime. + /// + /// Returns the signature generated for the message `ecdsa`. + fn test_ecdsa_crypto() -> (ecdsa::AppSignature, ecdsa::AppPublic); /// Run various tests against storage. fn test_storage(); } @@ -485,6 +493,7 @@ impl_opaque_keys! { pub struct SessionKeys { pub ed25519: ed25519::AppPublic, pub sr25519: sr25519::AppPublic, + pub ecdsa: ecdsa::AppPublic, } } @@ -620,6 +629,10 @@ cfg_if! { test_sr25519_crypto() } + fn test_ecdsa_crypto() -> (ecdsa::AppSignature, ecdsa::AppPublic) { + test_ecdsa_crypto() + } + fn test_storage() { test_read_storage(); test_read_child_storage(); @@ -837,6 +850,10 @@ cfg_if! { test_sr25519_crypto() } + fn test_ecdsa_crypto() -> (ecdsa::AppSignature, ecdsa::AppPublic) { + test_ecdsa_crypto() + } + fn test_storage() { test_read_storage(); test_read_child_storage(); @@ -929,6 +946,22 @@ fn test_sr25519_crypto() -> (sr25519::AppSignature, sr25519::AppPublic) { (signature, public0) } +fn test_ecdsa_crypto() -> (ecdsa::AppSignature, ecdsa::AppPublic) { + let public0 = ecdsa::AppPublic::generate_pair(None); + let public1 = ecdsa::AppPublic::generate_pair(None); + let public2 = ecdsa::AppPublic::generate_pair(None); + + let all = ecdsa::AppPublic::all(); + assert!(all.contains(&public0)); + assert!(all.contains(&public1)); + assert!(all.contains(&public2)); + + let signature = public0.sign(&"ecdsa").expect("Generates a valid `ecdsa` signature."); + + assert!(public0.verify(&"ecdsa", &signature)); + (signature, public0) +} + fn test_read_storage() { const KEY: &[u8] = b":read_storage"; sp_io::storage::set(KEY, b"test"); -- GitLab From 3f71d1ea54a653f78c2f6e1186204fb33f907520 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Fri, 15 May 2020 17:25:51 +0200 Subject: [PATCH 060/150] Meter block import results via prometheus (#6025) --- Cargo.lock | 5 +++ bin/node-template/node/src/service.rs | 22 ++++++++++- bin/node/cli/src/service.rs | 22 ++++++++++- client/consensus/aura/Cargo.toml | 1 + client/consensus/aura/src/lib.rs | 3 ++ client/consensus/babe/Cargo.toml | 1 + client/consensus/babe/src/lib.rs | 3 ++ client/consensus/manual-seal/Cargo.toml | 23 +++++------ client/consensus/manual-seal/src/lib.rs | 3 ++ client/consensus/pow/Cargo.toml | 1 + client/consensus/pow/src/lib.rs | 3 ++ client/network/src/service/tests.rs | 1 + client/network/test/src/block_import.rs | 1 + client/network/test/src/lib.rs | 2 + client/service/src/builder.rs | 10 +++-- primitives/consensus/common/Cargo.toml | 1 + .../common/src/import_queue/basic_queue.rs | 39 +++++++++++++++++++ primitives/consensus/common/src/lib.rs | 1 + primitives/consensus/common/src/metrics.rs | 39 +++++++++++++++++++ 19 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 primitives/consensus/common/src/metrics.rs diff --git a/Cargo.lock b/Cargo.lock index 0ea154b8df..5c50933839 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6096,6 +6096,7 @@ dependencies = [ "sp-runtime", "sp-timestamp", "sp-version", + "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tempfile", ] @@ -6145,6 +6146,7 @@ dependencies = [ "sp-runtime", "sp-timestamp", "sp-version", + "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tempfile", ] @@ -6209,6 +6211,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-transaction-pool", + "substrate-prometheus-endpoint", "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", "tempfile", @@ -6233,6 +6236,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-timestamp", + "substrate-prometheus-endpoint", ] [[package]] @@ -7404,6 +7408,7 @@ dependencies = [ "sp-test-primitives", "sp-utils", "sp-version", + "substrate-prometheus-endpoint", ] [[package]] diff --git a/bin/node-template/node/src/service.rs b/bin/node-template/node/src/service.rs index 36555b5a22..d02e9ea95e 100644 --- a/bin/node-template/node/src/service.rs +++ b/bin/node-template/node/src/service.rs @@ -43,7 +43,14 @@ macro_rules! new_full_start { let pool_api = sc_transaction_pool::FullChainApi::new(client.clone()); Ok(sc_transaction_pool::BasicPool::new(config, std::sync::Arc::new(pool_api), prometheus_registry)) })? - .with_import_queue(|_config, client, mut select_chain, _transaction_pool, spawn_task_handle| { + .with_import_queue(| + _config, + client, + mut select_chain, + _transaction_pool, + spawn_task_handle, + registry, + | { let select_chain = select_chain.take() .ok_or_else(|| sc_service::Error::SelectChainRequired)?; @@ -65,6 +72,7 @@ macro_rules! new_full_start { client, inherent_data_providers.clone(), spawn_task_handle, + registry, )?; import_setup = Some((grandpa_block_import, grandpa_link)); @@ -198,7 +206,16 @@ pub fn new_light(config: Configuration) -> Result Result( client: Arc, inherent_data_providers: InherentDataProviders, spawner: &S, + registry: Option<&Registry>, ) -> Result>, sp_consensus::Error> where B: BlockT, C::Api: BlockBuilderApi + AuraApi> + ApiExt, @@ -842,6 +844,7 @@ pub fn import_queue( justification_import, finality_proof_import, spawner, + registry, )) } diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index eed1d5d5da..1a0c7b2985 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -38,6 +38,7 @@ sc-consensus-uncles = { version = "0.8.0-dev", path = "../uncles" } sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 9c8883baf6..3d14f0a7bf 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -109,6 +109,7 @@ use sp_block_builder::BlockBuilder as BlockBuilderApi; use futures::prelude::*; use log::{debug, info, log, trace, warn}; +use prometheus_endpoint::Registry; use sc_consensus_slots::{ SlotWorker, SlotInfo, SlotCompatible, StorageChanges, CheckedHeader, check_equivocation, }; @@ -1291,6 +1292,7 @@ pub fn import_queue( client: Arc, inherent_data_providers: InherentDataProviders, spawner: &impl sp_core::traits::SpawnBlocking, + registry: Option<&Registry>, ) -> ClientResult>> where Inner: BlockImport> + Send + Sync + 'static, @@ -1314,6 +1316,7 @@ pub fn import_queue( justification_import, finality_proof_import, spawner, + registry, )) } diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 5217b5b139..3d42412f2f 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -22,19 +22,20 @@ parking_lot = "0.10.0" serde = { version = "1.0", features=["derive"] } assert_matches = "1.3.0" -sc-client-api = { path = "../../../client/api" , version = "2.0.0-dev"} -sc-transaction-pool = { path = "../../transaction-pool" , version = "2.0.0-dev"} -sp-blockchain = { path = "../../../primitives/blockchain" , version = "2.0.0-dev"} -sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common" , version = "0.8.0-dev"} -sp-inherents = { path = "../../../primitives/inherents" , version = "2.0.0-dev"} -sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-dev"} -sp-core = { path = "../../../primitives/core" , version = "2.0.0-dev"} -sp-transaction-pool = { path = "../../../primitives/transaction-pool" , version = "2.0.0-dev"} +sc-client-api = { path = "../../../client/api", version = "2.0.0-dev" } +sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-dev" } +sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-dev" } +sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-dev" } +sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-dev" } +sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-dev" } +sp-core = { path = "../../../primitives/core", version = "2.0.0-dev" } +sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-dev" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev" } [dev-dependencies] -sc-basic-authorship = { path = "../../basic-authorship" , version = "0.8.0-dev"} -substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" , version = "2.0.0-dev"} -substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool" , version = "2.0.0-dev"} +sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-dev" } +substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-dev" } +substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-dev" } tokio = { version = "0.2", features = ["rt-core", "macros"] } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index 14eaada567..6354e43ed3 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -29,6 +29,7 @@ use sp_runtime::{traits::Block as BlockT, Justification}; use sc_client_api::backend::{Backend as ClientBackend, Finalizer}; use sc_transaction_pool::txpool; use std::{sync::Arc, marker::PhantomData}; +use prometheus_endpoint::Registry; mod error; mod finalize_block; @@ -69,6 +70,7 @@ impl Verifier for ManualSealVerifier { pub fn import_queue( block_import: BoxBlockImport, spawner: &impl sp_core::traits::SpawnBlocking, + registry: Option<&Registry>, ) -> BasicQueue where Block: BlockT, @@ -80,6 +82,7 @@ pub fn import_queue( None, None, spawner, + registry, ) } diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index cb4f44479e..3d47a983ea 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -26,3 +26,4 @@ log = "0.4.8" futures = { version = "0.3.1", features = ["compat"] } sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } derive_more = "0.99.2" +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index dc647448e0..846377b7bc 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -54,6 +54,7 @@ use sp_consensus::import_queue::{ BoxBlockImport, BasicQueue, Verifier, BoxJustificationImport, BoxFinalityProofImport, }; use codec::{Encode, Decode}; +use prometheus_endpoint::Registry; use sc_client_api; use log::*; use sp_timestamp::{InherentError as TIError, TimestampInherentData}; @@ -465,6 +466,7 @@ pub fn import_queue( algorithm: Algorithm, inherent_data_providers: InherentDataProviders, spawner: &impl sp_core::traits::SpawnBlocking, + registry: Option<&Registry>, ) -> Result< PowImportQueue, sp_consensus::Error @@ -483,6 +485,7 @@ pub fn import_queue( justification_import, finality_proof_import, spawner, + registry, )) } diff --git a/client/network/src/service/tests.rs b/client/network/src/service/tests.rs index 4347f80d2b..eada49d741 100644 --- a/client/network/src/service/tests.rs +++ b/client/network/src/service/tests.rs @@ -87,6 +87,7 @@ fn build_test_full_node(config: config::NetworkConfiguration) None, None, &sp_core::testing::SpawnBlockingExecutor::new(), + None, )); let worker = NetworkWorker::new(config::Params { diff --git a/client/network/test/src/block_import.rs b/client/network/test/src/block_import.rs index 6bc2b9dbad..4e66ff879f 100644 --- a/client/network/test/src/block_import.rs +++ b/client/network/test/src/block_import.rs @@ -93,6 +93,7 @@ fn async_import_queue_drops() { None, None, &executor, + None, ); drop(queue); } diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index cdcdf37ccf..76bc2afa69 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -613,6 +613,7 @@ pub trait TestNetFactory: Sized { justification_import, finality_proof_import, &sp_core::testing::SpawnBlockingExecutor::new(), + None, )); let listen_addr = build_multiaddr![Memory(rand::random::())]; @@ -691,6 +692,7 @@ pub trait TestNetFactory: Sized { justification_import, finality_proof_import, &sp_core::testing::SpawnBlockingExecutor::new(), + None, )); let listen_addr = build_multiaddr![Memory(rand::random::())]; diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 413fe709f7..1bbf065825 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -485,7 +485,7 @@ impl /// Defines which import queue to use. pub fn with_import_queue( self, - builder: impl FnOnce(&Configuration, Arc, Option, Arc, &SpawnTaskHandle) + builder: impl FnOnce(&Configuration, Arc, Option, Arc, &SpawnTaskHandle, Option<&Registry>) -> Result ) -> Result, Error> @@ -496,6 +496,7 @@ impl self.select_chain.clone(), self.transaction_pool.clone(), &self.task_manager.spawn_handle(), + self.config.prometheus_config.as_ref().map(|config| &config.registry), )?; Ok(ServiceBuilder { @@ -586,6 +587,7 @@ impl Option, Arc, &SpawnTaskHandle, + Option<&Registry>, ) -> Result<(UImpQu, Option), Error> ) -> Result, Error> @@ -598,6 +600,7 @@ impl self.select_chain.clone(), self.transaction_pool.clone(), &self.task_manager.spawn_handle(), + self.config.prometheus_config.as_ref().map(|config| &config.registry), )?; Ok(ServiceBuilder { @@ -630,12 +633,13 @@ impl Option, Arc, &SpawnTaskHandle, + Option<&Registry>, ) -> Result<(UImpQu, UFprb), Error> ) -> Result, Error> where TSc: Clone, TFchr: Clone { - self.with_import_queue_and_opt_fprb(|cfg, cl, b, f, sc, tx, tb| - builder(cfg, cl, b, f, sc, tx, tb) + self.with_import_queue_and_opt_fprb(|cfg, cl, b, f, sc, tx, tb, pr| + builder(cfg, cl, b, f, sc, tx, tb, pr) .map(|(q, f)| (q, Some(f))) ) } diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 1125059913..ec05e9fba1 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -29,6 +29,7 @@ sp-utils = { version = "2.0.0-dev", path = "../../utils" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" serde = { version = "1.0", features = ["derive"] } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} [dev-dependencies] sp-test-primitives = { version = "2.0.0-dev", path = "../../test-primitives" } diff --git a/primitives/consensus/common/src/import_queue/basic_queue.rs b/primitives/consensus/common/src/import_queue/basic_queue.rs index 8b27dba4c3..c63c73bb42 100644 --- a/primitives/consensus/common/src/import_queue/basic_queue.rs +++ b/primitives/consensus/common/src/import_queue/basic_queue.rs @@ -20,8 +20,10 @@ use futures::{prelude::*, task::Context, task::Poll}; use futures_timer::Delay; use sp_runtime::{Justification, traits::{Block as BlockT, Header as HeaderT, NumberFor}}; use sp_utils::mpsc::{TracingUnboundedSender, tracing_unbounded}; +use prometheus_endpoint::Registry; use crate::block_import::BlockOrigin; +use crate::metrics::Metrics; use crate::import_queue::{ BlockImportResult, BlockImportError, Verifier, BoxBlockImport, BoxFinalityProofImport, BoxJustificationImport, ImportQueue, Link, Origin, @@ -58,14 +60,21 @@ impl BasicQueue { justification_import: Option>, finality_proof_import: Option>, spawner: &impl sp_core::traits::SpawnBlocking, + prometheus_registry: Option<&Registry>, ) -> Self { let (result_sender, result_port) = buffered_link::buffered_link(); + let metrics = prometheus_registry.and_then(|r| + Metrics::register(r) + .map_err(|err| { log::warn!("Failed to register Prometheus metrics: {}", err); }) + .ok() + ); let (future, worker_sender) = BlockImportWorker::new( result_sender, verifier, block_import, justification_import, finality_proof_import, + metrics, ); spawner.spawn_blocking("basic-block-import-worker", future.boxed()); @@ -133,9 +142,15 @@ struct BlockImportWorker { justification_import: Option>, finality_proof_import: Option>, delay_between_blocks: Duration, + metrics: Option, _phantom: PhantomData, } +const METRIC_SUCCESS_FIELDS: [&'static str; 8] = [ + "success", "incomplete_header", "verification_failed", "bad_block", + "missing_state", "unknown_parent", "cancelled", "failed" +]; + impl BlockImportWorker { fn new>( result_sender: BufferedLinkSender, @@ -143,6 +158,7 @@ impl BlockImportWorker { block_import: BoxBlockImport, justification_import: Option>, finality_proof_import: Option>, + metrics: Option, ) -> (impl Future + Send, TracingUnboundedSender>) { let (sender, mut port) = tracing_unbounded("mpsc_block_import_worker"); @@ -151,6 +167,7 @@ impl BlockImportWorker { justification_import, finality_proof_import, delay_between_blocks: Duration::new(0, 0), + metrics, _phantom: PhantomData, }; @@ -241,9 +258,31 @@ impl BlockImportWorker { blocks: Vec> ) -> impl Future, V)> { let mut result_sender = self.result_sender.clone(); + let metrics = self.metrics.clone(); import_many_blocks(block_import, origin, blocks, verifier, self.delay_between_blocks) .then(move |(imported, count, results, block_import, verifier)| { + if let Some(metrics) = metrics { + let amounts = results.iter().fold([0u64; 8], |mut acc, result| { + match result.0 { + Ok(_) => acc[0] += 1, + Err(BlockImportError::IncompleteHeader(_)) => acc[1] += 1, + Err(BlockImportError::VerificationFailed(_,_)) => acc[2] += 1, + Err(BlockImportError::BadBlock(_)) => acc[3] += 1, + Err(BlockImportError::MissingState) => acc[4] += 1, + Err(BlockImportError::UnknownParent) => acc[5] += 1, + Err(BlockImportError::Cancelled) => acc[6] += 1, + Err(BlockImportError::Other(_)) => acc[7] += 1, + }; + acc + }); + for (idx, field) in METRIC_SUCCESS_FIELDS.iter().enumerate() { + let amount = amounts[idx]; + if amount > 0 { + metrics.import_queue_processed.with_label_values(&[&field]).inc_by(amount) + } + }; + } result_sender.blocks_processed(imported, count, results); future::ready((block_import, verifier)) }) diff --git a/primitives/consensus/common/src/lib.rs b/primitives/consensus/common/src/lib.rs index 9f338ad1d4..52b034ffdd 100644 --- a/primitives/consensus/common/src/lib.rs +++ b/primitives/consensus/common/src/lib.rs @@ -44,6 +44,7 @@ pub mod block_import; mod select_chain; pub mod import_queue; pub mod evaluation; +mod metrics; // block size limit. const MAX_BLOCK_SIZE: usize = 4 * 1024 * 1024 + 512; diff --git a/primitives/consensus/common/src/metrics.rs b/primitives/consensus/common/src/metrics.rs new file mode 100644 index 0000000000..90e01214d8 --- /dev/null +++ b/primitives/consensus/common/src/metrics.rs @@ -0,0 +1,39 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Metering tools for consensus + +use prometheus_endpoint::{register, U64, Registry, PrometheusError, Opts, CounterVec}; + +/// Generic Prometheus metrics for common consensus functionality. +#[derive(Clone)] +pub(crate) struct Metrics { + pub import_queue_processed: CounterVec, +} + +impl Metrics { + pub(crate) fn register(registry: &Registry) -> Result { + Ok(Self { + import_queue_processed: register( + CounterVec::new( + Opts::new("import_queue_processed_total", "Blocks processed by import queue"), + &["result"] // 'success or failure + )?, + registry, + )?, + }) + } +} -- GitLab From 7e9a2ae78d27cc56e053fbec3b34a1a258b89561 Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Fri, 15 May 2020 21:56:56 +0200 Subject: [PATCH 061/150] Releasing Alpha.8 (#6048) --- Cargo.lock | 354 +++++++++--------- bin/node-template/node/Cargo.toml | 40 +- bin/node-template/pallets/template/Cargo.toml | 12 +- bin/node-template/runtime/Cargo.toml | 48 +-- bin/node/bench/Cargo.toml | 18 +- bin/node/browser-testing/Cargo.toml | 6 +- bin/node/cli/Cargo.toml | 120 +++--- bin/node/executor/Cargo.toml | 50 +-- bin/node/inspect/Cargo.toml | 14 +- bin/node/primitives/Cargo.toml | 12 +- bin/node/rpc-client/Cargo.toml | 6 +- bin/node/rpc/Cargo.toml | 38 +- bin/node/runtime/Cargo.toml | 112 +++--- bin/node/testing/Cargo.toml | 68 ++-- bin/utils/chain-spec-builder/Cargo.toml | 10 +- bin/utils/subkey/Cargo.toml | 20 +- client/api/Cargo.toml | 44 +-- client/authority-discovery/Cargo.toml | 24 +- client/basic-authorship/Cargo.toml | 26 +- client/block-builder/Cargo.toml | 20 +- client/chain-spec/Cargo.toml | 14 +- client/chain-spec/derive/Cargo.toml | 2 +- client/cli/Cargo.toml | 32 +- client/consensus/aura/Cargo.toml | 50 +-- client/consensus/babe/Cargo.toml | 58 +-- client/consensus/babe/rpc/Cargo.toml | 26 +- client/consensus/common/Cargo.toml | 10 +- client/consensus/epochs/Cargo.toml | 10 +- client/consensus/manual-seal/Cargo.toml | 26 +- client/consensus/pow/Cargo.toml | 24 +- client/consensus/slots/Cargo.toml | 24 +- client/consensus/uncles/Cargo.toml | 14 +- client/db/Cargo.toml | 28 +- client/executor/Cargo.toml | 36 +- client/executor/common/Cargo.toml | 12 +- client/executor/runtime-test/Cargo.toml | 14 +- client/executor/wasmi/Cargo.toml | 12 +- client/executor/wasmtime/Cargo.toml | 12 +- client/finality-grandpa/Cargo.toml | 54 +-- client/finality-grandpa/rpc/Cargo.toml | 6 +- client/informant/Cargo.toml | 12 +- client/keystore/Cargo.toml | 6 +- client/network-gossip/Cargo.toml | 8 +- client/network/Cargo.toml | 32 +- client/network/test/Cargo.toml | 26 +- client/offchain/Cargo.toml | 26 +- client/peerset/Cargo.toml | 4 +- client/rpc-api/Cargo.toml | 14 +- client/rpc-servers/Cargo.toml | 4 +- client/rpc/Cargo.toml | 44 +-- client/service/Cargo.toml | 68 ++-- client/service/test/Cargo.toml | 40 +- client/state-db/Cargo.toml | 6 +- client/telemetry/Cargo.toml | 2 +- client/tracing/Cargo.toml | 4 +- client/transaction-pool/Cargo.toml | 28 +- client/transaction-pool/graph/Cargo.toml | 14 +- docs/CHANGELOG.md | 22 ++ frame/assets/Cargo.toml | 14 +- frame/aura/Cargo.toml | 26 +- frame/authority-discovery/Cargo.toml | 22 +- frame/authorship/Cargo.toml | 18 +- frame/babe/Cargo.toml | 30 +- frame/balances/Cargo.toml | 18 +- frame/benchmark/Cargo.toml | 14 +- frame/benchmarking/Cargo.toml | 16 +- frame/collective/Cargo.toml | 18 +- frame/contracts/Cargo.toml | 26 +- frame/contracts/common/Cargo.toml | 6 +- frame/contracts/rpc/Cargo.toml | 16 +- frame/contracts/rpc/runtime-api/Cargo.toml | 10 +- frame/democracy/Cargo.toml | 24 +- frame/elections-phragmen/Cargo.toml | 22 +- frame/elections/Cargo.toml | 16 +- frame/evm/Cargo.toml | 18 +- frame/example-offchain-worker/Cargo.toml | 14 +- frame/example/Cargo.toml | 18 +- frame/executive/Cargo.toml | 26 +- frame/finality-tracker/Cargo.toml | 18 +- frame/generic-asset/Cargo.toml | 14 +- frame/grandpa/Cargo.toml | 38 +- frame/identity/Cargo.toml | 18 +- frame/im-online/Cargo.toml | 24 +- frame/indices/Cargo.toml | 18 +- frame/membership/Cargo.toml | 14 +- frame/metadata/Cargo.toml | 6 +- frame/nicks/Cargo.toml | 16 +- frame/offences/Cargo.toml | 18 +- frame/offences/benchmarking/Cargo.toml | 38 +- frame/randomness-collective-flip/Cargo.toml | 14 +- frame/recovery/Cargo.toml | 16 +- frame/scheduler/Cargo.toml | 16 +- frame/scored-pool/Cargo.toml | 16 +- frame/session/Cargo.toml | 24 +- frame/session/benchmarking/Cargo.toml | 26 +- frame/society/Cargo.toml | 16 +- frame/staking/Cargo.toml | 42 +-- frame/staking/fuzzer/Cargo.toml | 26 +- frame/staking/reward-curve/Cargo.toml | 4 +- frame/sudo/Cargo.toml | 14 +- frame/support/Cargo.toml | 24 +- frame/support/procedural/Cargo.toml | 4 +- frame/support/procedural/tools/Cargo.toml | 4 +- .../procedural/tools/derive/Cargo.toml | 2 +- frame/support/test/Cargo.toml | 14 +- frame/system/Cargo.toml | 18 +- frame/system/benchmarking/Cargo.toml | 16 +- frame/system/rpc/runtime-api/Cargo.toml | 4 +- frame/timestamp/Cargo.toml | 22 +- frame/transaction-payment/Cargo.toml | 20 +- frame/transaction-payment/rpc/Cargo.toml | 14 +- .../rpc/runtime-api/Cargo.toml | 10 +- frame/treasury/Cargo.toml | 18 +- frame/utility/Cargo.toml | 20 +- frame/vesting/Cargo.toml | 20 +- primitives/allocator/Cargo.toml | 8 +- primitives/api/Cargo.toml | 16 +- primitives/api/proc-macro/Cargo.toml | 2 +- primitives/api/test/Cargo.toml | 22 +- primitives/application-crypto/Cargo.toml | 8 +- primitives/application-crypto/test/Cargo.toml | 12 +- primitives/arithmetic/Cargo.toml | 6 +- primitives/arithmetic/fuzzer/Cargo.toml | 4 +- primitives/authority-discovery/Cargo.toml | 10 +- primitives/authorship/Cargo.toml | 8 +- primitives/block-builder/Cargo.toml | 10 +- primitives/blockchain/Cargo.toml | 10 +- primitives/chain-spec/Cargo.toml | 2 +- primitives/consensus/aura/Cargo.toml | 14 +- primitives/consensus/babe/Cargo.toml | 18 +- primitives/consensus/common/Cargo.toml | 20 +- primitives/consensus/pow/Cargo.toml | 10 +- primitives/consensus/vrf/Cargo.toml | 8 +- primitives/core/Cargo.toml | 14 +- primitives/database/Cargo.toml | 2 +- primitives/debug-derive/Cargo.toml | 2 +- primitives/externalities/Cargo.toml | 6 +- primitives/finality-grandpa/Cargo.toml | 12 +- primitives/finality-tracker/Cargo.toml | 6 +- primitives/inherents/Cargo.toml | 6 +- primitives/io/Cargo.toml | 16 +- primitives/keyring/Cargo.toml | 6 +- primitives/offchain/Cargo.toml | 10 +- primitives/panic-handler/Cargo.toml | 2 +- primitives/phragmen/Cargo.toml | 14 +- primitives/phragmen/compact/Cargo.toml | 2 +- primitives/phragmen/fuzzer/Cargo.toml | 6 +- primitives/rpc/Cargo.toml | 4 +- primitives/runtime-interface/Cargo.toml | 20 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../test-wasm-deprecated/Cargo.toml | 10 +- .../runtime-interface/test-wasm/Cargo.toml | 10 +- primitives/runtime-interface/test/Cargo.toml | 18 +- primitives/runtime/Cargo.toml | 16 +- primitives/sandbox/Cargo.toml | 10 +- primitives/serializer/Cargo.toml | 2 +- primitives/session/Cargo.toml | 12 +- primitives/staking/Cargo.toml | 6 +- primitives/state-machine/Cargo.toml | 12 +- primitives/std/Cargo.toml | 2 +- primitives/storage/Cargo.toml | 6 +- primitives/test-primitives/Cargo.toml | 8 +- primitives/timestamp/Cargo.toml | 10 +- primitives/tracing/Cargo.toml | 2 +- primitives/transaction-pool/Cargo.toml | 8 +- primitives/trie/Cargo.toml | 8 +- primitives/utils/Cargo.toml | 2 +- primitives/version/Cargo.toml | 6 +- primitives/wasm-interface/Cargo.toml | 4 +- test-utils/Cargo.toml | 2 +- test-utils/client/Cargo.toml | 24 +- test-utils/runtime/Cargo.toml | 60 +-- test-utils/runtime/client/Cargo.toml | 24 +- .../runtime/transaction-pool/Cargo.toml | 12 +- utils/browser/Cargo.toml | 12 +- utils/build-script-utils/Cargo.toml | 2 +- utils/fork-tree/Cargo.toml | 2 +- utils/frame/benchmarking-cli/Cargo.toml | 20 +- utils/frame/rpc/support/Cargo.toml | 10 +- utils/frame/rpc/system/Cargo.toml | 20 +- utils/prometheus/Cargo.toml | 2 +- 181 files changed, 1783 insertions(+), 1761 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c50933839..eac3ec0562 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -586,7 +586,7 @@ dependencies = [ [[package]] name = "chain-spec-builder" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "ansi_term 0.12.1", "node-cli", @@ -1405,14 +1405,14 @@ checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" [[package]] name = "fork-tree" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", ] [[package]] name = "frame-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -1428,7 +1428,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1445,7 +1445,7 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-dev" +version = "11.0.0-alpha.8" dependencies = [ "parity-scale-codec", "serde", @@ -1475,7 +1475,7 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "bitmask", "frame-metadata", @@ -1500,7 +1500,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support-procedural-tools", "proc-macro2", @@ -1510,7 +1510,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1521,7 +1521,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -1530,7 +1530,7 @@ dependencies = [ [[package]] name = "frame-support-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "parity-scale-codec", @@ -1547,7 +1547,7 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "criterion 0.2.11", "frame-support", @@ -1565,7 +1565,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -1580,7 +1580,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-api", @@ -3368,7 +3368,7 @@ dependencies = [ [[package]] name = "node-bench" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "fs_extra", @@ -3397,7 +3397,7 @@ dependencies = [ [[package]] name = "node-browser-testing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -3414,7 +3414,7 @@ dependencies = [ [[package]] name = "node-cli" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "assert_cmd", "frame-benchmarking-cli", @@ -3488,7 +3488,7 @@ dependencies = [ [[package]] name = "node-executor" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "criterion 0.3.1", "frame-benchmarking", @@ -3522,7 +3522,7 @@ dependencies = [ [[package]] name = "node-inspect" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "log", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "node-primitives" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-system", "parity-scale-codec", @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "node-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "jsonrpc-core", "node-primitives", @@ -3576,7 +3576,7 @@ dependencies = [ [[package]] name = "node-rpc-client" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "env_logger 0.7.1", "futures 0.1.29", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "node-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-executive", @@ -3655,7 +3655,7 @@ dependencies = [ [[package]] name = "node-template" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "log", @@ -3684,7 +3684,7 @@ dependencies = [ [[package]] name = "node-template-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-executive", "frame-support", @@ -3716,7 +3716,7 @@ dependencies = [ [[package]] name = "node-testing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "criterion 0.3.1", "frame-support", @@ -3929,7 +3929,7 @@ dependencies = [ [[package]] name = "pallet-assets" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -3943,7 +3943,7 @@ dependencies = [ [[package]] name = "pallet-aura" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -3965,7 +3965,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -3999,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4021,7 +4021,7 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4037,7 +4037,7 @@ dependencies = [ [[package]] name = "pallet-benchmark" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4051,7 +4051,7 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4068,7 +4068,7 @@ dependencies = [ [[package]] name = "pallet-contracts" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "assert_matches", "frame-support", @@ -4094,7 +4094,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -4103,7 +4103,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4122,7 +4122,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4133,7 +4133,7 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4153,7 +4153,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4169,7 +4169,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4188,7 +4188,7 @@ dependencies = [ [[package]] name = "pallet-evm" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "evm", "frame-support", @@ -4208,7 +4208,7 @@ dependencies = [ [[package]] name = "pallet-example" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4224,7 +4224,7 @@ dependencies = [ [[package]] name = "pallet-example-offchain-worker" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4239,7 +4239,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4256,7 +4256,7 @@ dependencies = [ [[package]] name = "pallet-generic-asset" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4270,7 +4270,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "finality-grandpa", "frame-support", @@ -4297,7 +4297,7 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4314,7 +4314,7 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4333,7 +4333,7 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4349,7 +4349,7 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4363,7 +4363,7 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4378,7 +4378,7 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4394,7 +4394,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4419,7 +4419,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4433,7 +4433,7 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "enumflags2", "frame-support", @@ -4449,7 +4449,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4464,7 +4464,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4479,7 +4479,7 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4500,7 +4500,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4536,7 +4536,7 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "env_logger 0.7.1", "frame-benchmarking", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4614,7 +4614,7 @@ dependencies = [ [[package]] name = "pallet-template" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4626,7 +4626,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4644,7 +4644,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -4660,7 +4660,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4677,7 +4677,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "parity-scale-codec", @@ -4690,7 +4690,7 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4706,7 +4706,7 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-benchmarking", "frame-support", @@ -4722,7 +4722,7 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5846,7 +5846,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "bytes 0.5.4", "derive_more", @@ -5876,7 +5876,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5917,7 +5917,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "ansi_term 0.12.1", "app_dirs", @@ -5984,7 +5984,7 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "fnv", @@ -6022,7 +6022,7 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "blake2-rfc", "env_logger 0.7.1", @@ -6055,7 +6055,7 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6065,7 +6065,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "env_logger 0.7.1", @@ -6103,7 +6103,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "env_logger 0.7.1", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "futures 0.3.4", @@ -6178,7 +6178,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6190,7 +6190,7 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "assert_matches", "derive_more", @@ -6220,7 +6220,7 @@ dependencies = [ [[package]] name = "sc-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "futures 0.3.4", @@ -6241,7 +6241,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "log", "sc-client-api", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "assert_matches", "derive_more", @@ -6311,7 +6311,7 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "log", @@ -6327,7 +6327,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "log", "parity-scale-codec", @@ -6341,7 +6341,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "assert_matches", "cranelift-codegen", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "assert_matches", "derive_more", @@ -6406,7 +6406,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "finality-grandpa", @@ -6423,7 +6423,7 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "ansi_term 0.12.1", "futures 0.3.4", @@ -6439,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "hex", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "assert_matches", "async-std", @@ -6513,7 +6513,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "async-std", "futures 0.3.4", @@ -6531,7 +6531,7 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "env_logger 0.7.1", "futures 0.3.4", @@ -6557,7 +6557,7 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "bytes 0.5.4", "env_logger 0.7.1", @@ -6590,7 +6590,7 @@ dependencies = [ [[package]] name = "sc-peerset" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "libp2p", @@ -6603,7 +6603,7 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "assert_matches", "futures 0.1.29", @@ -6642,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "futures 0.3.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6679,7 +6679,7 @@ dependencies = [ [[package]] name = "sc-runtime-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "sp-allocator", "sp-core", @@ -6692,7 +6692,7 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "exit-future", @@ -6753,7 +6753,7 @@ dependencies = [ [[package]] name = "sc-service-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "env_logger 0.7.1", "fdlimit", @@ -6788,7 +6788,7 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "env_logger 0.7.1", "log", @@ -6802,7 +6802,7 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "bytes 0.5.4", "futures 0.3.4", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "erased-serde", "log", @@ -6838,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "assert_matches", "criterion 0.3.1", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "assert_matches", "derive_more", @@ -7230,7 +7230,7 @@ dependencies = [ [[package]] name = "sp-allocator" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "log", @@ -7241,7 +7241,7 @@ dependencies = [ [[package]] name = "sp-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "hash-db", "parity-scale-codec", @@ -7256,7 +7256,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "sp-api-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "criterion 0.3.1", "parity-scale-codec", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "serde", @@ -7297,7 +7297,7 @@ dependencies = [ [[package]] name = "sp-application-crypto-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "sp-api", "sp-application-crypto", @@ -7308,7 +7308,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "criterion 0.3.1", "integer-sqrt", @@ -7324,7 +7324,7 @@ dependencies = [ [[package]] name = "sp-arithmetic-fuzzer" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "honggfuzz", "num-bigint", @@ -7335,7 +7335,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7356,7 +7356,7 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7367,7 +7367,7 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "log", @@ -7382,7 +7382,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "serde", "serde_json", @@ -7390,7 +7390,7 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "derive_more", "futures 0.3.4", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "merlin", "parity-scale-codec", @@ -7442,7 +7442,7 @@ dependencies = [ [[package]] name = "sp-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "base58", "blake2-rfc", @@ -7510,7 +7510,7 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7518,7 +7518,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -7527,7 +7527,7 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "environmental", "parity-scale-codec", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "finality-grandpa", "log", @@ -7552,7 +7552,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7561,7 +7561,7 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "parity-scale-codec", @@ -7572,7 +7572,7 @@ dependencies = [ [[package]] name = "sp-io" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "hash-db", @@ -7591,7 +7591,7 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "lazy_static", "sp-core", @@ -7601,7 +7601,7 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "sp-api", "sp-core", @@ -7611,7 +7611,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "backtrace", "log", @@ -7619,7 +7619,7 @@ dependencies = [ [[package]] name = "sp-phragmen" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "rand 0.7.3", @@ -7634,7 +7634,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7655,7 +7655,7 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "serde", "serde_json", @@ -7664,7 +7664,7 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "hash256-std-hasher", "impl-trait-for-tuples", @@ -7686,7 +7686,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7706,7 +7706,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "Inflector", "proc-macro-crate", @@ -7717,7 +7717,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "sc-executor", "sp-core", @@ -7732,7 +7732,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "sp-core", "sp-io", @@ -7743,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "sp-core", "sp-io", @@ -7754,7 +7754,7 @@ dependencies = [ [[package]] name = "sp-sandbox" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "assert_matches", "parity-scale-codec", @@ -7768,7 +7768,7 @@ dependencies = [ [[package]] name = "sp-serializer" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "serde", "serde_json", @@ -7776,7 +7776,7 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-api", @@ -7788,7 +7788,7 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7797,7 +7797,7 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "hash-db", "hex-literal", @@ -7817,11 +7817,11 @@ dependencies = [ [[package]] name = "sp-std" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" [[package]] name = "sp-storage" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7832,7 +7832,7 @@ dependencies = [ [[package]] name = "sp-test-primitives" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "parity-scale-codec", "parity-util-mem", @@ -7844,7 +7844,7 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7857,14 +7857,14 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "tracing", ] [[package]] name = "sp-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "futures 0.3.4", @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "sp-trie" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "criterion 0.2.11", "hash-db", @@ -7896,7 +7896,7 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "futures-core", @@ -7906,7 +7906,7 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7917,7 +7917,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8032,7 +8032,7 @@ dependencies = [ [[package]] name = "subkey" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "clap", "derive_more", @@ -8074,7 +8074,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "chrono", "clear_on_drop", @@ -8100,14 +8100,14 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-support" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "frame-support", "frame-system", @@ -8123,7 +8123,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "env_logger 0.7.1", "frame-system-rpc-runtime-api", @@ -8146,7 +8146,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" dependencies = [ "async-std", "derive_more", @@ -8159,7 +8159,7 @@ dependencies = [ [[package]] name = "substrate-test-client" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "hash-db", @@ -8179,7 +8179,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "cfg-if", "frame-executive", @@ -8222,7 +8222,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "futures 0.3.4", "parity-scale-codec", @@ -8241,7 +8241,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" dependencies = [ "derive_more", "futures 0.3.4", @@ -8256,7 +8256,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" [[package]] name = "substrate-wasm-builder" diff --git a/bin/node-template/node/Cargo.toml b/bin/node-template/node/Cargo.toml index 030672ee6f..c4df4f18a2 100644 --- a/bin/node-template/node/Cargo.toml +++ b/bin/node-template/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Anonymous"] description = "Substrate Node template" edition = "2018" @@ -21,25 +21,25 @@ log = "0.4.8" structopt = "0.3.8" parking_lot = "0.10.0" -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sc-service = { version = "0.8.0-dev", path = "../../../client/service" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -sc-network = { version = "0.8.0-dev", path = "../../../client/network" } -sc-consensus-aura = { version = "0.8.0-dev", path = "../../../client/consensus/aura" } -sp-consensus-aura = { version = "0.8.0-dev", path = "../../../primitives/consensus/aura" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } -sp-finality-grandpa = { version = "2.0.0-dev", path = "../../../primitives/finality-grandpa" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-dev"} +sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } +sc-service = { version = "0.8.0-alpha.8", path = "../../../client/service" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } +sc-network = { version = "0.8.0-alpha.8", path = "../../../client/network" } +sc-consensus-aura = { version = "0.8.0-alpha.8", path = "../../../client/consensus/aura" } +sp-consensus-aura = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/aura" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } +sc-finality-grandpa = { version = "0.8.0-alpha.8", path = "../../../client/finality-grandpa" } +sp-finality-grandpa = { version = "2.0.0-alpha.8", path = "../../../primitives/finality-grandpa" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-alpha.8"} -node-template-runtime = { version = "2.0.0-dev", path = "../runtime" } +node-template-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } [build-dependencies] -substrate-build-script-utils = { version = "2.0.0-dev", path = "../../../utils/build-script-utils" } +substrate-build-script-utils = { version = "2.0.0-alpha.8", path = "../../../utils/build-script-utils" } diff --git a/bin/node-template/pallets/template/Cargo.toml b/bin/node-template/pallets/template/Cargo.toml index 01484c608c..24f40f4126 100644 --- a/bin/node-template/pallets/template/Cargo.toml +++ b/bin/node-template/pallets/template/Cargo.toml @@ -2,7 +2,7 @@ authors = ['Anonymous'] edition = '2018' name = 'pallet-template' -version = "2.0.0-dev" +version = "2.0.0-alpha.8" license = "Unlicense" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" @@ -16,26 +16,26 @@ codec = { package = "parity-scale-codec", version = "1.3.0", default-features = [dependencies.frame-support] default-features = false -version = "2.0.0-dev" +version = "2.0.0-alpha.8" path = "../../../../frame/support" [dependencies.frame-system] default-features = false -version = "2.0.0-dev" +version = "2.0.0-alpha.8" path = "../../../../frame/system" [dev-dependencies.sp-core] default-features = false -version = "2.0.0-dev" +version = "2.0.0-alpha.8" path = "../../../../primitives/core" [dev-dependencies.sp-io] default-features = false -version = "2.0.0-dev" +version = "2.0.0-alpha.8" path = "../../../../primitives/io" [dev-dependencies.sp-runtime] default-features = false -version = "2.0.0-dev" +version = "2.0.0-alpha.8" path = "../../../../primitives/runtime" diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index dfd517130b..b1151c64d9 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Anonymous"] edition = "2018" license = "Unlicense" @@ -13,31 +13,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -aura = { version = "2.0.0-dev", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } -balances = { version = "2.0.0-dev", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } -grandpa = { version = "2.0.0-dev", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } -randomness-collective-flip = { version = "2.0.0-dev", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } -sudo = { version = "2.0.0-dev", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } -system = { version = "2.0.0-dev", default-features = false, package = "frame-system", path = "../../../frame/system" } -timestamp = { version = "2.0.0-dev", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } -transaction-payment = { version = "2.0.0-dev", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } -frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../../frame/executive" } +aura = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } +balances = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/support" } +grandpa = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } +randomness-collective-flip = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } +sudo = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } +system = { version = "2.0.0-alpha.8", default-features = false, package = "frame-system", path = "../../../frame/system" } +timestamp = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } +transaction-payment = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } +frame-executive = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/executive" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/api" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-dev"} -sp-consensus-aura = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/consensus/aura" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-dev"} -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/io" } -sp-offchain = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/offchain" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/session" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/version" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/api" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-alpha.8"} +sp-consensus-aura = { version = "0.8.0-alpha.8", default-features = false, path = "../../../primitives/consensus/aura" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } +sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-alpha.8"} +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/io" } +sp-offchain = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/offchain" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/session" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +sp-transaction-pool = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/version" } -template = { version = "2.0.0-dev", default-features = false, path = "../pallets/template", package = "pallet-template" } +template = { version = "2.0.0-alpha.8", default-features = false, path = "../pallets/template", package = "pallet-template" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index ec72a125bb..443bfaeede 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-bench" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Substrate node integration benchmarks." edition = "2018" @@ -10,20 +10,20 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] log = "0.4.8" -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-testing = { version = "2.0.0-dev", path = "../testing" } -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } +node-testing = { version = "2.0.0-alpha.8", path = "../testing" } +sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api/" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } serde = "1.0.101" serde_json = "1.0.41" structopt = "0.3" derive_more = "0.99.2" kvdb = "0.6" kvdb-rocksdb = "0.8" -sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../../primitives/trie" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } hash-db = "0.15.2" tempfile = "3.1.0" fs_extra = "1" diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 3885aa3b09..2178fc631f 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-browser-testing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Tests for the in-browser light client." edition = "2018" @@ -17,5 +17,5 @@ wasm-bindgen-futures = "0.4.10" wasm-bindgen-test = "0.3.10" futures = "0.3.4" -node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-dev"} -sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-dev"} +node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-alpha.8"} +sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-alpha.8"} diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 281bee8dbb..1e4c9b6be3 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-cli" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Generic Substrate node implementation in Rust." build = "build.rs" @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] [badges] travis-ci = { repository = "paritytech/substrate" } -maintenance = { status = "actively-developed" } +maintenance = { status = "actively-alpha.8eloped" } is-it-maintained-issue-resolution = { repository = "paritytech/substrate" } is-it-maintained-open-issues = { repository = "paritytech/substrate" } @@ -46,76 +46,76 @@ tracing = "0.1.10" parking_lot = "0.10.0" # primitives -sp-authority-discovery = { version = "2.0.0-dev", path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } -grandpa-primitives = { version = "2.0.0-dev", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/timestamp" } -sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/finality-tracker" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sp-authority-discovery = { version = "2.0.0-alpha.8", path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } +grandpa-primitives = { version = "2.0.0-alpha.8", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/timestamp" } +sp-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/finality-tracker" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } +sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } # client dependencies -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sc-chain-spec = { version = "2.0.0-dev", path = "../../../client/chain-spec" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../../../client/transaction-pool" } -sc-network = { version = "0.8.0-dev", path = "../../../client/network" } -sc-consensus-babe = { version = "0.8.0-dev", path = "../../../client/consensus/babe" } -grandpa = { version = "0.8.0-dev", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } -sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../../../client/db" } -sc-offchain = { version = "2.0.0-dev", path = "../../../client/offchain" } -sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } -sc-basic-authorship = { version = "0.8.0-dev", path = "../../../client/basic-authorship" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } -sc-tracing = { version = "2.0.0-dev", path = "../../../client/tracing" } -sc-telemetry = { version = "2.0.0-dev", path = "../../../client/telemetry" } -sc-authority-discovery = { version = "0.8.0-dev", path = "../../../client/authority-discovery" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } +sc-chain-spec = { version = "2.0.0-alpha.8", path = "../../../client/chain-spec" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../client/transaction-pool" } +sc-network = { version = "0.8.0-alpha.8", path = "../../../client/network" } +sc-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../client/consensus/babe" } +grandpa = { version = "0.8.0-alpha.8", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } +sc-client-db = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/db" } +sc-offchain = { version = "2.0.0-alpha.8", path = "../../../client/offchain" } +sc-rpc = { version = "2.0.0-alpha.8", path = "../../../client/rpc" } +sc-basic-authorship = { version = "0.8.0-alpha.8", path = "../../../client/basic-authorship" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } +sc-tracing = { version = "2.0.0-alpha.8", path = "../../../client/tracing" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../../../client/telemetry" } +sc-authority-discovery = { version = "0.8.0-alpha.8", path = "../../../client/authority-discovery" } # frame dependencies -pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../frame/timestamp" } -pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } -pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../../frame/im-online" } -pallet-authority-discovery = { version = "2.0.0-dev", path = "../../../frame/authority-discovery" } -pallet-staking = { version = "2.0.0-dev", path = "../../../frame/staking" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-alpha.8", path = "../../../frame/indices" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/timestamp" } +pallet-contracts = { version = "2.0.0-alpha.8", path = "../../../frame/contracts" } +frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/support" } +pallet-im-online = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/im-online" } +pallet-authority-discovery = { version = "2.0.0-alpha.8", path = "../../../frame/authority-discovery" } +pallet-staking = { version = "2.0.0-alpha.8", path = "../../../frame/staking" } +pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } # node-specific dependencies -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -node-rpc = { version = "2.0.0-dev", path = "../rpc" } -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-executor = { version = "2.0.0-dev", path = "../executor" } +node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +node-rpc = { version = "2.0.0-alpha.8", path = "../rpc" } +node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } +node-executor = { version = "2.0.0-alpha.8", path = "../executor" } # CLI-specific dependencies -sc-cli = { version = "0.8.0-dev", optional = true, path = "../../../client/cli" } -frame-benchmarking-cli = { version = "2.0.0-dev", optional = true, path = "../../../utils/frame/benchmarking-cli" } -node-inspect = { version = "0.8.0-dev", optional = true, path = "../inspect" } +sc-cli = { version = "0.8.0-alpha.8", optional = true, path = "../../../client/cli" } +frame-benchmarking-cli = { version = "2.0.0-alpha.8", optional = true, path = "../../../utils/frame/benchmarking-cli" } +node-inspect = { version = "0.8.0-alpha.8", optional = true, path = "../inspect" } # WASM-specific dependencies wasm-bindgen = { version = "0.2.57", optional = true } wasm-bindgen-futures = { version = "0.4.7", optional = true } -browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-dev"} +browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-alpha.8"} [target.'cfg(target_arch="x86_64")'.dependencies] -node-executor = { version = "2.0.0-dev", path = "../executor", features = [ "wasmtime" ] } -sc-cli = { version = "0.8.0-dev", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } +node-executor = { version = "2.0.0-alpha.8", path = "../executor", features = [ "wasmtime" ] } +sc-cli = { version = "0.8.0-alpha.8", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } [dev-dependencies] -sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-consensus-babe = { version = "0.8.0-dev", features = ["test-helpers"], path = "../../../client/consensus/babe" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../../../client/consensus/epochs" } -sc-service-test = { version = "2.0.0-dev", path = "../../../client/service/test" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../../../client/keystore" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } +sc-consensus-babe = { version = "0.8.0-alpha.8", features = ["test-helpers"], path = "../../../client/consensus/babe" } +sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../../../client/consensus/epochs" } +sc-service-test = { version = "2.0.0-alpha.8", path = "../../../client/service/test" } futures = "0.3.4" tempfile = "3.1.0" assert_cmd = "1.0" @@ -126,12 +126,12 @@ platforms = "0.2.1" [build-dependencies] structopt = { version = "0.3.8", optional = true } -node-inspect = { version = "0.8.0-dev", optional = true, path = "../inspect" } -frame-benchmarking-cli = { version = "2.0.0-dev", optional = true, path = "../../../utils/frame/benchmarking-cli" } -substrate-build-script-utils = { version = "2.0.0-dev", optional = true, path = "../../../utils/build-script-utils" } +node-inspect = { version = "0.8.0-alpha.8", optional = true, path = "../inspect" } +frame-benchmarking-cli = { version = "2.0.0-alpha.8", optional = true, path = "../../../utils/frame/benchmarking-cli" } +substrate-build-script-utils = { version = "2.0.0-alpha.8", optional = true, path = "../../../utils/build-script-utils" } [build-dependencies.sc-cli] -version = "0.8.0-dev" +version = "0.8.0-alpha.8" package = "sc-cli" path = "../../../client/cli" optional = true diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 014ac9a4c8..78cfb3e5b4 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-executor" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" @@ -13,34 +13,34 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } +node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } +node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../../primitives/trie" } trie-root = "0.16.0" -frame-benchmarking = { version = "2.0.0-dev", path = "../../../frame/benchmarking" } +frame-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/benchmarking" } [dev-dependencies] criterion = "0.3.0" -frame-support = { version = "2.0.0-dev", path = "../../../frame/support" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -node-testing = { version = "2.0.0-dev", path = "../testing" } -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-dev", path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } -pallet-session = { version = "2.0.0-dev", path = "../../../frame/session" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-dev", path = "../../../frame/treasury" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } -substrate-test-client = { version = "2.0.0-dev", path = "../../../test-utils/client" } +frame-support = { version = "2.0.0-alpha.8", path = "../../../frame/support" } +frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } +node-testing = { version = "2.0.0-alpha.8", path = "../testing" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } +pallet-contracts = { version = "2.0.0-alpha.8", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-alpha.8", path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-alpha.8", path = "../../../frame/indices" } +pallet-session = { version = "2.0.0-alpha.8", path = "../../../frame/session" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-alpha.8", path = "../../../frame/treasury" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../../primitives/externalities" } +substrate-test-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/client" } wabt = "0.9.2" [features] diff --git a/bin/node/inspect/Cargo.toml b/bin/node/inspect/Cargo.toml index 5beb1f948e..c16bb0493a 100644 --- a/bin/node/inspect/Cargo.toml +++ b/bin/node/inspect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-inspect" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,10 +14,10 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0" } derive_more = "0.99" log = "0.4.8" -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } structopt = "0.3.8" diff --git a/bin/node/primitives/Cargo.toml b/bin/node/primitives/Cargo.toml index 5850db83d4..96f8428a1c 100644 --- a/bin/node/primitives/Cargo.toml +++ b/bin/node/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-primitives" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,13 +12,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/application-crypto" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/application-crypto" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } [dev-dependencies] -sp-serializer = { version = "2.0.0-dev", path = "../../../primitives/serializer" } +sp-serializer = { version = "2.0.0-alpha.8", path = "../../../primitives/serializer" } pretty_assertions = "0.6.1" [features] diff --git a/bin/node/rpc-client/Cargo.toml b/bin/node/rpc-client/Cargo.toml index 8ba5aed4aa..80ca0063b2 100644 --- a/bin/node/rpc-client/Cargo.toml +++ b/bin/node/rpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc-client" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,5 +16,5 @@ futures = "0.1.29" hyper = "0.12.35" jsonrpc-core-client = { version = "14.0.5", default-features = false, features = ["http"] } log = "0.4.8" -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } +node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } +sc-rpc = { version = "2.0.0-alpha.8", path = "../../../client/rpc" } diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index ef948cd009..bd8a8bd312 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -11,22 +11,22 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } jsonrpc-core = "14.0.3" -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -pallet-contracts-rpc = { version = "0.8.0-dev", path = "../../../frame/contracts/rpc/" } -pallet-transaction-payment-rpc = { version = "2.0.0-dev", path = "../../../frame/transaction-payment/rpc/" } -substrate-frame-rpc-system = { version = "2.0.0-dev", path = "../../../utils/frame/rpc/system" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -sc-consensus-babe = { version = "0.8.0-dev", path = "../../../client/consensus/babe" } -sc-consensus-babe-rpc = { version = "0.8.0-dev", path = "../../../client/consensus/babe/rpc" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } -sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../../../client/consensus/epochs" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } -sc-finality-grandpa-rpc = { version = "0.8.0-dev", path = "../../../client/finality-grandpa/rpc" } +node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } +node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +pallet-contracts-rpc = { version = "0.8.0-alpha.8", path = "../../../frame/contracts/rpc/" } +pallet-transaction-payment-rpc = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment/rpc/" } +substrate-frame-rpc-system = { version = "2.0.0-alpha.8", path = "../../../utils/frame/rpc/system" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } +sc-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../client/consensus/babe" } +sc-consensus-babe-rpc = { version = "0.8.0-alpha.8", path = "../../../client/consensus/babe/rpc" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../../../client/keystore" } +sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../../../client/consensus/epochs" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sc-finality-grandpa = { version = "0.8.0-alpha.8", path = "../../../client/finality-grandpa" } +sc-finality-grandpa-rpc = { version = "0.8.0-alpha.8", path = "../../../client/finality-grandpa/rpc" } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 8ca89367fe..afcc63d5d7 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -20,68 +20,68 @@ serde = { version = "1.0.102", optional = true } static_assertions = "1.1.0" # primitives -sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/consensus/babe" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-dev"} -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } -node-primitives = { version = "2.0.0-dev", default-features = false, path = "../primitives" } -sp-offchain = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/offchain" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } -sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../../primitives/keyring" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/session" } -sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/version" } +sp-authority-discovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-alpha.8", default-features = false, path = "../../../primitives/consensus/babe" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-alpha.8"} +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/inherents" } +node-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "../primitives" } +sp-offchain = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/offchain" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/staking" } +sp-keyring = { version = "2.0.0-alpha.8", optional = true, path = "../../../primitives/keyring" } +sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/session" } +sp-transaction-pool = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/version" } # frame dependencies -frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../../frame/executive" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system" } -frame-system-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system/benchmarking", optional = true } -frame-system-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } -pallet-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../frame/authority-discovery" } -pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../../../frame/authorship" } -pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../../frame/babe" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../../../frame/balances" } -pallet-collective = { version = "2.0.0-dev", default-features = false, path = "../../../frame/collective" } -pallet-contracts = { version = "2.0.0-dev", default-features = false, path = "../../../frame/contracts" } -pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "../../../frame/contracts/common/" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-dev", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } -pallet-democracy = { version = "2.0.0-dev", default-features = false, path = "../../../frame/democracy" } -pallet-elections-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../../frame/elections-phragmen" } -pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../frame/finality-tracker" } -pallet-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-dev", default-features = false, path = "../../../frame/indices" } -pallet-identity = { version = "2.0.0-dev", default-features = false, path = "../../../frame/identity" } -pallet-membership = { version = "2.0.0-dev", default-features = false, path = "../../../frame/membership" } -pallet-offences = { version = "2.0.0-dev", default-features = false, path = "../../../frame/offences" } -pallet-offences-benchmarking = { version = "2.0.0-dev", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } -pallet-randomness-collective-flip = { version = "2.0.0-dev", default-features = false, path = "../../../frame/randomness-collective-flip" } -pallet-recovery = { version = "2.0.0-dev", default-features = false, path = "../../../frame/recovery" } -pallet-session = { version = "2.0.0-dev", features = ["historical"], path = "../../../frame/session", default-features = false } -pallet-session-benchmarking = { version = "2.0.0-dev", path = "../../../frame/session/benchmarking", default-features = false, optional = true } -pallet-staking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/staking" } -pallet-staking-reward-curve = { version = "2.0.0-dev", default-features = false, path = "../../../frame/staking/reward-curve" } -pallet-scheduler = { version = "2.0.0-dev", default-features = false, path = "../../../frame/scheduler" } -pallet-society = { version = "2.0.0-dev", default-features = false, path = "../../../frame/society" } -pallet-sudo = { version = "2.0.0-dev", default-features = false, path = "../../../frame/sudo" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../frame/timestamp" } -pallet-treasury = { version = "2.0.0-dev", default-features = false, path = "../../../frame/treasury" } -pallet-utility = { version = "2.0.0-dev", default-features = false, path = "../../../frame/utility" } -pallet-transaction-payment = { version = "2.0.0-dev", default-features = false, path = "../../../frame/transaction-payment" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } -pallet-vesting = { version = "2.0.0-dev", default-features = false, path = "../../../frame/vesting" } +frame-executive = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/executive" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/benchmarking", optional = true } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system" } +frame-system-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system/benchmarking", optional = true } +frame-system-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } +pallet-authority-discovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/authority-discovery" } +pallet-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/authorship" } +pallet-babe = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/babe" } +pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/balances" } +pallet-collective = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/collective" } +pallet-contracts = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/contracts" } +pallet-contracts-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/contracts/common/" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-alpha.8", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } +pallet-democracy = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/democracy" } +pallet-elections-phragmen = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/elections-phragmen" } +pallet-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/finality-tracker" } +pallet-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/indices" } +pallet-identity = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/identity" } +pallet-membership = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/membership" } +pallet-offences = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/offences" } +pallet-offences-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } +pallet-randomness-collective-flip = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/randomness-collective-flip" } +pallet-recovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/recovery" } +pallet-session = { version = "2.0.0-alpha.8", features = ["historical"], path = "../../../frame/session", default-features = false } +pallet-session-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/session/benchmarking", default-features = false, optional = true } +pallet-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/staking" } +pallet-staking-reward-curve = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/staking/reward-curve" } +pallet-scheduler = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/scheduler" } +pallet-society = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/society" } +pallet-sudo = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/sudo" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/timestamp" } +pallet-treasury = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/treasury" } +pallet-utility = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/utility" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/transaction-payment" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } +pallet-vesting = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/vesting" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index dded81ac8e..37518ebe80 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-testing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Test utilities for Substrate node." edition = "2018" @@ -13,40 +13,40 @@ publish = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -sc-service = { version = "0.8.0-dev", features = ["test-helpers", "db"], path = "../../../client/service" } -sc-client-db = { version = "0.8.0-dev", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } +sc-service = { version = "0.8.0-alpha.8", features = ["test-helpers", "db"], path = "../../../client/service" } +sc-client-db = { version = "0.8.0-alpha.8", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api/" } codec = { package = "parity-scale-codec", version = "1.3.0" } -pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } -pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -node-executor = { version = "2.0.0-dev", path = "../executor" } -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -frame-support = { version = "2.0.0-dev", path = "../../../frame/support" } -pallet-session = { version = "2.0.0-dev", path = "../../../frame/session" } -pallet-society = { version = "2.0.0-dev", path = "../../../frame/society" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -pallet-staking = { version = "2.0.0-dev", path = "../../../frame/staking" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor", features = ["wasmtime"] } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -substrate-test-client = { version = "2.0.0-dev", path = "../../../test-utils/client" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-dev", path = "../../../frame/treasury" } +pallet-contracts = { version = "2.0.0-alpha.8", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-alpha.8", path = "../../../frame/indices" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } +node-executor = { version = "2.0.0-alpha.8", path = "../executor" } +node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } +node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", path = "../../../frame/support" } +pallet-session = { version = "2.0.0-alpha.8", path = "../../../frame/session" } +pallet-society = { version = "2.0.0-alpha.8", path = "../../../frame/society" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-alpha.8", path = "../../../frame/staking" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor", features = ["wasmtime"] } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } +substrate-test-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/client" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-alpha.8", path = "../../../frame/treasury" } wabt = "0.9.2" -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/finality-tracker" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/timestamp" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sp-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/finality-tracker" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/timestamp" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } log = "0.4.8" tempfile = "3.1.0" fs_extra = "1" @@ -54,4 +54,4 @@ futures = "0.3.1" [dev-dependencies] criterion = "0.3.0" -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } +sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index 211460400c..d4faa4f1e3 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chain-spec-builder" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,9 +13,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" -sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } -sc-chain-spec = { version = "2.0.0-dev", path = "../../../client/chain-spec" } -node-cli = { version = "2.0.0-dev", path = "../../node/cli" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../../../client/keystore" } +sc-chain-spec = { version = "2.0.0-alpha.8", path = "../../../client/chain-spec" } +node-cli = { version = "2.0.0-alpha.8", path = "../../node/cli" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } rand = "0.7.2" structopt = "0.3.8" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 488b0f7fbc..91643b4551 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "subkey" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,10 +12,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.1.29" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -node-runtime = { version = "2.0.0-dev", path = "../../node/runtime" } -node-primitives = { version = "2.0.0-dev", path = "../../node/primitives" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +node-runtime = { version = "2.0.0-alpha.8", path = "../../node/runtime" } +node-primitives = { version = "2.0.0-alpha.8", path = "../../node/primitives" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } rand = "0.7.2" clap = "2.33.0" tiny-bip39 = "0.7" @@ -23,14 +23,14 @@ substrate-bip39 = "0.4.1" hex = "0.4.0" hex-literal = "0.2.1" codec = { package = "parity-scale-codec", version = "1.3.0" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } +frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } +pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } rpassword = "4.0.1" itertools = "0.8.2" derive_more = { version = "0.99.2" } -sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } +sc-rpc = { version = "2.0.0-alpha.8", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" libp2p = "0.18.1" diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 9e983eb966..9d79e2ca5a 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,36 +14,36 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } derive_more = { version = "0.99.2" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } +sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } fnv = { version = "1.0.6" } futures = { version = "0.3.1" } hash-db = { version = "0.15.2", default-features = false } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } kvdb = "0.6.0" log = { version = "0.4.8" } parking_lot = "0.10.0" lazy_static = "1.4.0" -sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } +sp-database = { version = "2.0.0-alpha.8", path = "../../primitives/database" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/version" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-alpha.8", path = "../../utils/prometheus" } [dev-dependencies] kvdb-memorydb = "0.6.0" -sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } +sp-test-primitives = { version = "2.0.0-alpha.8", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime" } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index d2b74b51e1..ad567bf0e6 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-authority-discovery" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -23,21 +23,21 @@ futures = "0.3.4" futures-timer = "3.0.1" libp2p = { version = "0.18.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-alpha.8"} prost = "0.6.1" rand = "0.7.2" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } -sc-network = { version = "0.8.0-dev", path = "../network" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } serde_json = "1.0.41" -sp-authority-discovery = { version = "2.0.0-dev", path = "../../primitives/authority-discovery" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-authority-discovery = { version = "2.0.0-alpha.8", path = "../../primitives/authority-discovery" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } [dev-dependencies] env_logger = "0.7.0" quickcheck = "0.9.0" -sc-peerset = { version = "2.0.0-dev", path = "../peerset" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client"} +sc-peerset = { version = "2.0.0-alpha.8", path = "../peerset" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client"} diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index ad15cbedd3..5a5aaacd5f 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-basic-authorship" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,20 +15,20 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4.8" futures = "0.3.4" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-dev", path = "../../primitives/inherents" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../primitives/inherents" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } futures-timer = "3.0.1" [dev-dependencies] -sc-transaction-pool = { version = "2.0.0-dev", path = "../../client/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../client/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } parking_lot = "0.10.0" diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index df2aca9cf5..07eb6fc82a 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-block-builder" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-block-builder = { version = "2.0.0-dev", path = "../../primitives/block-builder" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../../primitives/block-builder" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } [dev-dependencies] substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } diff --git a/client/chain-spec/Cargo.toml b/client/chain-spec/Cargo.toml index fbbf05f55b..305de23b1d 100644 --- a/client/chain-spec/Cargo.toml +++ b/client/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,12 +12,12 @@ description = "Substrate chain configurations." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-chain-spec-derive = { version = "2.0.0-dev", path = "./derive" } +sc-chain-spec-derive = { version = "2.0.0-alpha.8", path = "./derive" } impl-trait-for-tuples = "0.1.3" -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-chain-spec = { version = "2.0.0-dev", path = "../../primitives/chain-spec" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-chain-spec = { version = "2.0.0-alpha.8", path = "../../primitives/chain-spec" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } diff --git a/client/chain-spec/derive/Cargo.toml b/client/chain-spec/derive/Cargo.toml index 643b3bab82..beacd7ffda 100644 --- a/client/chain-spec/derive/Cargo.toml +++ b/client/chain-spec/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec-derive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 1dc5f1a39f..8be0381ee8 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-cli" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" @@ -26,23 +26,23 @@ tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.4" fdlimit = "0.1.4" serde_json = "1.0.41" -sc-informant = { version = "0.8.0-dev", path = "../informant" } -sp-panic-handler = { version = "2.0.0-dev", path = "../../primitives/panic-handler" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../service" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-dev"} -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sc-informant = { version = "0.8.0-alpha.8", path = "../informant" } +sp-panic-handler = { version = "2.0.0-alpha.8", path = "../../primitives/panic-handler" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../service" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-alpha.8"} +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } names = "0.11.0" structopt = "0.3.8" -sc-tracing = { version = "2.0.0-dev", path = "../tracing" } +sc-tracing = { version = "2.0.0-alpha.8", path = "../tracing" } chrono = "0.4.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index c8a00f9185..a4f5861260 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" @@ -12,37 +12,37 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-dev", path = "../../../primitives/consensus/aura" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/aura" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } derive_more = "0.99.2" futures = "0.3.4" futures-timer = "3.0.1" -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sc-keystore = { version = "2.0.0-dev", path = "../../keystore" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../../keystore" } log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-version = { version = "2.0.0-dev", path = "../../../primitives/version" } -sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } +sp-version = { version = "2.0.0-alpha.8", path = "../../../primitives/version" } +sc-consensus-slots = { version = "0.8.0-alpha.8", path = "../slots" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-alpha.8", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../../telemetry" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} [dev-dependencies] -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-dev", path = "../../executor" } -sc-network = { version = "0.8.0-dev", path = "../../network" } -sc-network-test = { version = "0.8.0-dev", path = "../../network/test" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../executor" } +sc-network = { version = "0.8.0-alpha.8", path = "../../network" } +sc-network-test = { version = "0.8.0-alpha.8", path = "../../network/test" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 1a0c7b2985..033f3da62b 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" @@ -14,31 +14,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } num-bigint = "0.2.3" num-rational = "0.2.2" num-traits = "0.2.8" serde = { version = "1.0.104", features = ["derive"] } -sp-version = { version = "2.0.0-dev", path = "../../../primitives/version" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } -sc-keystore = { version = "2.0.0-dev", path = "../../keystore" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../epochs" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-consensus-vrf = { version = "0.8.0-dev", path = "../../../primitives/consensus/vrf" } -sc-consensus-uncles = { version = "0.8.0-dev", path = "../uncles" } -sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +sp-version = { version = "2.0.0-alpha.8", path = "../../../primitives/version" } +sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sp-timestamp = { version = "2.0.0-alpha.8", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../../telemetry" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../../keystore" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../epochs" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-consensus-vrf = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/vrf" } +sc-consensus-uncles = { version = "0.8.0-alpha.8", path = "../uncles" } +sc-consensus-slots = { version = "0.8.0-alpha.8", path = "../slots" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +fork-tree = { version = "2.0.0-alpha.8", path = "../../../utils/fork-tree" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" @@ -50,13 +50,13 @@ pdqselect = "0.1.0" derive_more = "0.99.2" [dev-dependencies] -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-dev", path = "../../executor" } -sc-network = { version = "0.8.0-dev", path = "../../network" } -sc-network-test = { version = "0.8.0-dev", path = "../../network/test" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../executor" } +sc-network = { version = "0.8.0-alpha.8", path = "../../network" } +sc-network-test = { version = "0.8.0-alpha.8", path = "../../network/test" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../block-builder" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/rpc/Cargo.toml b/client/consensus/babe/rpc/Cargo.toml index 2a0762e1a8..1f365a9e2a 100644 --- a/client/consensus/babe/rpc/Cargo.toml +++ b/client/consensus/babe/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe-rpc" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "RPC extensions for the BABE consensus algorithm" edition = "2018" @@ -12,24 +12,24 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-consensus-babe = { version = "0.8.0-dev", path = "../" } +sc-consensus-babe = { version = "0.8.0-alpha.8", path = "../" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../../primitives/consensus/babe" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../../primitives/consensus/babe" } serde = { version = "1.0.104", features=["derive"] } -sp-blockchain = { version = "2.0.0-dev", path = "../../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../../primitives/runtime" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../../epochs" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../../primitives/runtime" } +sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../../epochs" } futures = { version = "0.3.4", features = ["compat"] } derive_more = "0.99.2" -sp-api = { version = "2.0.0-dev", path = "../../../../primitives/api" } -sp-consensus = { version = "0.8.0-dev", path = "../../../../primitives/consensus/common" } -sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } -sc-keystore = { version = "2.0.0-dev", path = "../../../keystore" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../../primitives/api" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../../primitives/core" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../../../keystore" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../../primitives/application-crypto" } -sp-keyring = { version = "2.0.0-dev", path = "../../../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../../test-utils/runtime/client" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../../primitives/application-crypto" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../../../primitives/keyring" } tempfile = "3.1.0" diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index bf7fac9568..54fefb00fa 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,7 +12,7 @@ description = "Collection of common consensus specific imlementations for Substr targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } diff --git a/client/consensus/epochs/Cargo.toml b/client/consensus/epochs/Cargo.toml index 7c2edffc53..a55806ee38 100644 --- a/client/consensus/epochs/Cargo.toml +++ b/client/consensus/epochs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-epochs" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Generic epochs-based utilities for consensus" edition = "2018" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } -sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-dev"} -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sc-client-api = { path = "../../api" , version = "2.0.0-dev"} +fork-tree = { version = "2.0.0-alpha.8", path = "../../../utils/fork-tree" } +sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-alpha.8"} +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sc-client-api = { path = "../../api" , version = "2.0.0-alpha.8"} diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 3d42412f2f..34b7d13cb7 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-manual-seal" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Manual sealing engine for Substrate" edition = "2018" @@ -22,20 +22,20 @@ parking_lot = "0.10.0" serde = { version = "1.0", features=["derive"] } assert_matches = "1.3.0" -sc-client-api = { path = "../../../client/api", version = "2.0.0-dev" } -sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-dev" } -sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-dev" } -sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-dev" } -sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-dev" } -sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-dev" } -sp-core = { path = "../../../primitives/core", version = "2.0.0-dev" } -sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-dev" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev" } +sc-client-api = { path = "../../../client/api", version = "2.0.0-alpha.8" } +sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-alpha.8" } +sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-alpha.8" } +sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-alpha.8" } +sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-alpha.8" } +sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-alpha.8" } +sp-core = { path = "../../../primitives/core", version = "2.0.0-alpha.8" } +sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-alpha.8" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8" } [dev-dependencies] -sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-dev" } -substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-dev" } -substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-dev" } +sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-alpha.8" } +substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-alpha.8" } +substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-alpha.8" } tokio = { version = "0.2", features = ["rt-core", "macros"] } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index 3d47a983ea..a41c1bea79 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "PoW consensus algorithm for substrate" edition = "2018" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-consensus-pow = { version = "0.8.0-dev", path = "../../../primitives/consensus/pow" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sp-consensus-pow = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/pow" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } log = "0.4.8" futures = { version = "0.3.1", features = ["compat"] } -sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } +sp-timestamp = { version = "2.0.0-alpha.8", path = "../../../primitives/timestamp" } derive_more = "0.99.2" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index f778cbf2f0..fdaa4871a1 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-slots" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../../telemetry" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" log = "0.4.8" [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } diff --git a/client/consensus/uncles/Cargo.toml b/client/consensus/uncles/Cargo.toml index b9039d8189..e052e8b023 100644 --- a/client/consensus/uncles/Cargo.toml +++ b/client/consensus/uncles/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-uncles" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Generic uncle inclusion utilities for consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-authorship = { version = "2.0.0-dev", path = "../../../primitives/authorship" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-authorship = { version = "2.0.0-alpha.8", path = "../../../primitives/authorship" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } log = "0.4.8" diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index c9006ee2f6..9aaccf1da0 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-db" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -23,22 +23,22 @@ parity-util-mem = { version = "0.6.1", default-features = false, features = ["st codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } blake2-rfc = "0.2.18" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sc-state-db = { version = "0.8.0-dev", path = "../state-db" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } +sc-state-db = { version = "0.8.0-alpha.8", path = "../state-db" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-database = { version = "2.0.0-alpha.8", path = "../../primitives/database" } parity-db = { version = "0.1.2", optional = true } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-alpha.8", path = "../../utils/prometheus" } [dev-dependencies] -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } env_logger = "0.7.0" quickcheck = "0.9" kvdb-rocksdb = "0.8" diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index ac863fbd8c..cea11c9a0c 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,22 +15,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-serializer = { version = "2.0.0-dev", path = "../../primitives/serializer" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-panic-handler = { version = "2.0.0-dev", path = "../../primitives/panic-handler" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } +sp-serializer = { version = "2.0.0-alpha.8", path = "../../primitives/serializer" } +sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } +sp-panic-handler = { version = "2.0.0-alpha.8", path = "../../primitives/panic-handler" } wasmi = "0.6.2" parity-wasm = "0.41.0" lazy_static = "1.4.0" -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface" } -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } -sc-executor-common = { version = "0.8.0-dev", path = "common" } -sc-executor-wasmi = { version = "0.8.0-dev", path = "wasmi" } -sc-executor-wasmtime = { version = "0.8.0-dev", path = "wasmtime", optional = true } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../primitives/runtime-interface" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } +sc-executor-common = { version = "0.8.0-alpha.8", path = "common" } +sc-executor-wasmi = { version = "0.8.0-alpha.8", path = "wasmi" } +sc-executor-wasmtime = { version = "0.8.0-alpha.8", path = "wasmtime", optional = true } parking_lot = "0.10.0" log = "0.4.8" libsecp256k1 = "0.3.4" @@ -39,11 +39,11 @@ libsecp256k1 = "0.3.4" assert_matches = "1.3.0" wabt = "0.9.2" hex-literal = "0.2.1" -sc-runtime-test = { version = "2.0.0-dev", path = "runtime-test" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-runtime-test = { version = "2.0.0-alpha.8", path = "runtime-test" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } test-case = "0.3.3" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } [features] default = [ "std" ] diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index ed91c353b9..890010caf1 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-common" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,11 +18,11 @@ derive_more = "0.99.2" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } wasmi = "0.6.2" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } -sp-serializer = { version = "2.0.0-dev", path = "../../../primitives/serializer" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-alpha.8", path = "../../../primitives/allocator" } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime-interface" } +sp-serializer = { version = "2.0.0-alpha.8", path = "../../../primitives/serializer" } [features] default = [] diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index c675e72e0f..54ba45921f 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-runtime-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,12 +13,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/io" } -sp-sandbox = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/sandbox" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-allocator = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/allocator" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/io" } +sp-sandbox = { version = "0.8.0-alpha.8", default-features = false, path = "../../../primitives/sandbox" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +sp-allocator = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/allocator" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 7ccb167325..4638727742 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmi" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4.8" wasmi = "0.6.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-dev", path = "../common" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-alpha.8", path = "../common" } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-alpha.8", path = "../../../primitives/allocator" } diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 8a424dfc2e..0a803d772a 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmtime" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,11 +16,11 @@ log = "0.4.8" scoped-tls = "1.0" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-dev", path = "../common" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-alpha.8", path = "../common" } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-alpha.8", path = "../../../primitives/allocator" } wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.2" } wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.2" } wasmtime-environ = "0.16" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index f0f89b6278..179a938270 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -fork-tree = { version = "2.0.0-dev", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-alpha.8", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" @@ -23,37 +23,37 @@ parking_lot = "0.10.0" rand = "0.7.2" assert_matches = "1.3.0" parity-scale-codec = { version = "1.3.0", features = ["derive"] } -sp-arithmetic = { version = "2.0.0-dev", path = "../../primitives/arithmetic" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-dev", path = "../../client/consensus/common" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sp-arithmetic = { version = "2.0.0-alpha.8", path = "../../primitives/arithmetic" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../client/consensus/common" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } serde_json = "1.0.41" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-inherents = { version = "2.0.0-dev", path = "../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-network-gossip = { version = "0.8.0-dev", path = "../network-gossip" } -sp-finality-tracker = { version = "2.0.0-dev", path = "../../primitives/finality-tracker" } -sp-finality-grandpa = { version = "2.0.0-dev", path = "../../primitives/finality-grandpa" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-inherents = { version = "2.0.0-alpha.8", path = "../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sc-network-gossip = { version = "0.8.0-alpha.8", path = "../network-gossip" } +sp-finality-tracker = { version = "2.0.0-alpha.8", path = "../../primitives/finality-tracker" } +sp-finality-grandpa = { version = "2.0.0-alpha.8", path = "../../primitives/finality-grandpa" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-alpha.8"} +sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } pin-project = "0.4.6" [dev-dependencies] finality-grandpa = { version = "0.12.3", features = ["derive-codec", "test-helpers"] } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-network-test = { version = "0.8.0-dev", path = "../network/test" } -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../primitives/consensus/babe" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sc-network-test = { version = "0.8.0-alpha.8", path = "../network/test" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/babe" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } env_logger = "0.7.0" tokio = { version = "0.2", features = ["rt-core"] } tempfile = "3.1.0" -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } diff --git a/client/finality-grandpa/rpc/Cargo.toml b/client/finality-grandpa/rpc/Cargo.toml index 0eecec19f7..75d7497235 100644 --- a/client/finality-grandpa/rpc/Cargo.toml +++ b/client/finality-grandpa/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa-rpc" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "RPC extensions for the GRANDPA finality gadget" repository = "https://github.com/paritytech/substrate/" @@ -8,7 +8,7 @@ edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] -sc-finality-grandpa = { version = "0.8.0-dev", path = "../" } +sc-finality-grandpa = { version = "0.8.0-alpha.8", path = "../" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.3" @@ -20,4 +20,4 @@ log = "0.4.8" derive_more = "0.99.2" [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } diff --git a/client/informant/Cargo.toml b/client/informant/Cargo.toml index 5957cfc297..695f480915 100644 --- a/client/informant/Cargo.toml +++ b/client/informant/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-informant" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Substrate informant." edition = "2018" @@ -17,8 +17,8 @@ futures = "0.3.4" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } wasm-timer = "0.2" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../service" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../service" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index 6de93f28be..f81251bf6b 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-keystore" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../primitives/application-crypto" } hex = "0.4.0" rand = "0.7.2" serde_json = "1.0.41" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index d46e3420ea..78b80f1033 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Gossiping for the Substrate network protocol" name = "sc-network-gossip" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -19,12 +19,12 @@ futures-timer = "3.0.1" libp2p = { version = "0.18.1", default-features = false, features = ["websocket"] } log = "0.4.8" lru = "0.4.3" -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } wasm-timer = "0.2" [dev-dependencies] async-std = "1.5" quickcheck = "0.9.0" rand = "0.7.2" -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 537ab43672..e2bdea235d 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate network protocol" name = "sc-network" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -25,7 +25,7 @@ derive_more = "0.99.2" either = "1.5.3" erased-serde = "0.3.9" fnv = "1.0.6" -fork-tree = { version = "2.0.0-dev", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-alpha.8", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" futures_codec = "0.3.3" @@ -38,23 +38,23 @@ lru = "0.4.0" nohash-hasher = "0.2.0" parking_lot = "0.10.0" pin-project = "0.4.6" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-alpha.8", path = "../../utils/prometheus" } prost = "0.6.1" rand = "0.7.2" -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-peerset = { version = "2.0.0-dev", path = "../peerset" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sc-peerset = { version = "2.0.0-alpha.8", path = "../peerset" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } slog_derive = "0.2.0" smallvec = "0.6.10" -sp-arithmetic = { version = "2.0.0-dev", path = "../../primitives/arithmetic" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-arithmetic = { version = "2.0.0-alpha.8", path = "../../primitives/arithmetic" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } thiserror = "1" unsigned-varint = { version = "0.3.1", features = ["futures", "futures-codec"] } void = "1.0.2" @@ -73,10 +73,10 @@ env_logger = "0.7.0" libp2p = { version = "0.18.1", default-features = false, features = ["secio"] } quickcheck = "0.9.0" rand = "0.7.2" -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +sp-test-primitives = { version = "2.0.0-alpha.8", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } tempfile = "3.1.0" [features] diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 5abc9a1ea7..38e1ceb8ea 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Integration tests for Substrate network protocol" name = "sc-network-test" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-network = { version = "0.8.0-dev", path = "../" } +sc-network = { version = "0.8.0-alpha.8", path = "../" } log = "0.4.8" parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" rand = "0.7.2" libp2p = { version = "0.18.1", default-features = false, features = ["libp2p-websocket"] } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../block-builder" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } env_logger = "0.7.0" -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime" } tempfile = "3.1.0" -sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, features = ["test-helpers"], path = "../../service" } diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index 5a13b44a80..29c36331df 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers" name = "sc-offchain" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bytes = "0.5" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } fnv = "1.0.6" futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" threadpool = "1.7" num_cpus = "1.10" -sp-offchain = { version = "2.0.0-dev", path = "../../primitives/offchain" } +sp-offchain = { version = "2.0.0-alpha.8", path = "../../primitives/offchain" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } rand = "0.7.2" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } [target.'cfg(not(target_os = "unknown"))'.dependencies] hyper = "0.13.2" @@ -38,10 +38,10 @@ hyper-rustls = "0.20" [dev-dependencies] env_logger = "0.7.0" fdlimit = "0.1.4" -sc-client-db = { version = "0.8.0-dev", default-features = true, path = "../db/" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sc-client-db = { version = "0.8.0-alpha.8", default-features = true, path = "../db/" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } tokio = "0.2" [features] diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index b4c5005324..f23e89e0f5 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -3,7 +3,7 @@ description = "Connectivity manager based on reputation" homepage = "http://parity.io" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" name = "sc-peerset" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" repository = "https://github.com/paritytech/substrate/" @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" libp2p = { version = "0.18.1", default-features = false } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils"} +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils"} log = "0.4.8" serde_json = "1.0.41" wasm-timer = "0.2" diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index f591a6d853..3f984a09ed 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-api" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -21,11 +21,11 @@ jsonrpc-derive = "14.0.3" jsonrpc-pubsub = "14.0.3" log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-dev"} -sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-dev"} +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } +sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-alpha.8"} +sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-alpha.8"} serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sp-rpc = { version = "2.0.0-dev", path = "../../primitives/rpc" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +sp-rpc = { version = "2.0.0-alpha.8", path = "../../primitives/rpc" } diff --git a/client/rpc-servers/Cargo.toml b/client/rpc-servers/Cargo.toml index a57baf1db7..1f9172b908 100644 --- a/client/rpc-servers/Cargo.toml +++ b/client/rpc-servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-server" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -17,7 +17,7 @@ pubsub = { package = "jsonrpc-pubsub", version = "14.0.3" } log = "0.4.8" serde = "1.0.101" serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } [target.'cfg(not(target_os = "unknown"))'.dependencies] http = { package = "jsonrpc-http-server", version = "14.0.3" } diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 94d4b38600..a97a46fa29 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,38 +12,38 @@ description = "Substrate Client RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-rpc-api = { version = "0.8.0-dev", path = "../rpc-api" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sc-rpc-api = { version = "0.8.0-alpha.8", path = "../rpc-api" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.1", features = ["compat"] } jsonrpc-pubsub = "14.0.3" log = "0.4.8" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } rpc = { package = "jsonrpc-core", version = "14.0.3" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } serde_json = "1.0.41" -sp-session = { version = "2.0.0-dev", path = "../../primitives/session" } -sp-offchain = { version = "2.0.0-dev", path = "../../primitives/offchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-rpc = { version = "2.0.0-dev", path = "../../primitives/rpc" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-chain-spec = { version = "2.0.0-dev", path = "../../primitives/chain-spec" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sc-block-builder = { version = "0.8.0-dev", path = "../../client/block-builder" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-session = { version = "2.0.0-alpha.8", path = "../../primitives/session" } +sp-offchain = { version = "2.0.0-alpha.8", path = "../../primitives/offchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sp-rpc = { version = "2.0.0-alpha.8", path = "../../primitives/rpc" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sp-chain-spec = { version = "2.0.0-alpha.8", path = "../../primitives/chain-spec" } +sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../client/block-builder" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } hash-db = { version = "0.15.2", default-features = false } parking_lot = "0.10.0" [dev-dependencies] assert_matches = "1.3.0" futures01 = { package = "futures", version = "0.1.29" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } tokio = "0.1.22" -sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../transaction-pool" } lazy_static = "1.4.0" diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 5a026e5890..04a6f488b1 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -39,38 +39,38 @@ hash-db = "0.15.2" serde = "1.0.101" serde_json = "1.0.41" sysinfo = "0.13.3" -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-session = { version = "2.0.0-dev", path = "../../primitives/session" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-chain-spec = { version = "2.0.0-dev", path = "../chain-spec" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../db" } +sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-session = { version = "2.0.0-alpha.8", path = "../../primitives/session" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../primitives/application-crypto" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sc-chain-spec = { version = "2.0.0-alpha.8", path = "../chain-spec" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sc-client-db = { version = "0.8.0-alpha.8", default-features = false, path = "../db" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sc-rpc-server = { version = "2.0.0-dev", path = "../rpc-servers" } -sc-rpc = { version = "2.0.0-dev", path = "../rpc" } -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } -sp-block-builder = { version = "2.0.0-dev", path = "../../primitives/block-builder" } +sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../transaction-pool" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +sc-rpc-server = { version = "2.0.0-alpha.8", path = "../rpc-servers" } +sc-rpc = { version = "2.0.0-alpha.8", path = "../rpc" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../../primitives/block-builder" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sc-offchain = { version = "2.0.0-dev", path = "../offchain" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +sc-offchain = { version = "2.0.0-alpha.8", path = "../offchain" } parity-multiaddr = { package = "parity-multiaddr", version = "0.7.3" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-dev"} -sc-tracing = { version = "2.0.0-dev", path = "../tracing" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-alpha.8"} +sc-tracing = { version = "2.0.0-alpha.8", path = "../tracing" } tracing = "0.1.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } @@ -83,7 +83,7 @@ procfs = '0.7.8' [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../primitives/consensus/babe" } -grandpa = { version = "0.8.0-dev", package = "sc-finality-grandpa", path = "../finality-grandpa" } -grandpa-primitives = { version = "2.0.0-dev", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/babe" } +grandpa = { version = "0.8.0-alpha.8", package = "sc-finality-grandpa", path = "../finality-grandpa" } +grandpa-primitives = { version = "2.0.0-alpha.8", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index c44f436513..76420f9139 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,24 +20,24 @@ log = "0.4.8" env_logger = "0.7.0" fdlimit = "0.1.4" parking_lot = "0.10.0" -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } -sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } -sp-storage = { version = "2.0.0-dev", path = "../../../primitives/storage" } -sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../../db" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../../primitives/externalities" } +sp-trie = { version = "2.0.0-alpha.8", path = "../../../primitives/trie" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../../primitives/storage" } +sc-client-db = { version = "0.8.0-alpha.8", default-features = false, path = "../../db" } futures = { version = "0.3.1", features = ["compat"] } -sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../service" } -sc-network = { version = "0.8.0-dev", path = "../../network" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } -sc-executor = { version = "0.8.0-dev", path = "../../executor" } -sp-panic-handler = { version = "2.0.0-dev", path = "../../../primitives/panic-handler" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-network = { version = "0.8.0-alpha.8", path = "../../network" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../block-builder" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../executor" } +sp-panic-handler = { version = "2.0.0-alpha.8", path = "../../../primitives/panic-handler" } parity-scale-codec = "1.3.0" diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index f4f084bc89..17b9340afd 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-state-db" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = "0.10.0" log = "0.4.8" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parity-util-mem-derive = "0.1.0" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index e2c08babf3..4a3f302fb6 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-telemetry" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 52fa8d6600..4e1924180b 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-tracing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -20,7 +20,7 @@ serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } tracing-core = "0.1.7" -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } [dev-dependencies] tracing = "0.1.10" diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 8b51bc7418..a7b50c847c 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,21 +20,21 @@ intervalier = "0.4.0" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parking_lot = "0.10.0" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-transaction-graph = { version = "2.0.0-dev", path = "./graph" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-dev", path = "../../primitives/tracing" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-alpha.8"} +sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sc-transaction-graph = { version = "2.0.0-alpha.8", path = "./graph" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-alpha.8", path = "../../primitives/tracing" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } wasm-timer = "0.2" [dev-dependencies] assert_matches = "1.3.0" hex = "0.4" -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -substrate-test-runtime-transaction-pool = { version = "2.0.0-dev", path = "../../test-utils/runtime/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +substrate-test-runtime-transaction-pool = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index 4f9131aa96..eaa70743e2 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-graph" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,18 +18,18 @@ log = "0.4.8" parking_lot = "0.10.0" serde = { version = "1.0.101", features = ["derive"] } wasm-timer = "0.2" -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-utils = { version = "2.0.0-dev", path = "../../../primitives/utils" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../../primitives/utils" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } linked-hash-map = "0.5.2" [dev-dependencies] assert_matches = "1.3.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime" } criterion = "0.3" [[bench]] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 31e489ffe5..84c469386a 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,6 +6,28 @@ The format is based on [Keep a Changelog]. ## Unreleased +## 2.0.0-alpha.7 -> 2.0.0-alpha.8 + +**License Changed** +From this release forward, the code is released under a new – more relaxed – license scheme: Client (`sc-*`) is released under "GPL 3.0 or newer with the Classpath Exception", while primitives, FRAME, the pallets, utils and test-utils are released under "Apache 2.0". More details in the [Relax licensing scheme PR](https://github.com/paritytech/substrate/pull/5947). + +Runtime +------- + +* Democracy weight (#5828) +* Make `Digest` support `StorageAppend` (#5922) + +Client +------ + +* Meter block import results via prometheus (#6025) +* Added RuntimePublic for ecdsa public key. (#6029) +* Benchmarks for elections-phragmen pallet (#5845) +* Monitor transactions rejected from the pool as invalid (#5992) +* client/network: Remove default Kademlia DHT in favor of per protocol DHT (#5993) +* Allow passing multiple --log CLI options (#5982) +* client: Replace `unsafe_rpc_expose` with an `RpcMethods` enum (#5729) + ## 2.0.0-alpha.6 -> 2.0.0-alpha.7 Runtime diff --git a/frame/assets/Cargo.toml b/frame/assets/Cargo.toml index dc2a838d1c..6dc6e3e513 100644 --- a/frame/assets/Cargo.toml +++ b/frame/assets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-assets" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } # Needed for various traits. In our case, `OnFinalize`. -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } # Needed for type-safe access to storage DB. -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } # `system` module provides us with all sorts of useful stuff and macros depend on it being around. -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index cd7f17ba13..f052f8c7e4 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-aura" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME AURA consensus pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -sp-consensus-aura = { path = "../../primitives/consensus/aura", default-features = false, version = "0.8.0-dev"} -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } +pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +sp-consensus-aura = { path = "../../primitives/consensus/aura", default-features = false, version = "0.8.0-alpha.8"} +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/timestamp" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } [dev-dependencies] diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index 134dff4017..a9f352a8bc 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME pallet for authority discovery" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authority-discovery" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-authority-discovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/authority-discovery" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -pallet-session = { version = "2.0.0-dev", features = ["historical" ], path = "../session", default-features = false } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +pallet-session = { version = "2.0.0-alpha.8", features = ["historical" ], path = "../session", default-features = false } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } [features] default = ["std"] diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index d5769783a9..46ce41e148 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authorship" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" description = "Block and Uncle Author tracking for the FRAME" authors = ["Parity Technologies "] edition = "2018" @@ -12,15 +12,15 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-authorship = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authorship" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/authorship" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} impl-trait-for-tuples = "0.1.3" [features] diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 685e508a3d..3340f7a71e 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-babe" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,22 +14,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } -sp-consensus-vrf = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/vrf" } -sp-io = { path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/timestamp" } +pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } +sp-consensus-babe = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/babe" } +sp-consensus-vrf = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/vrf" } +sp-io = { path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index 3916d5605f..29802a68d2 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-balances" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../transaction-payment" } [features] default = ["std"] diff --git a/frame/benchmark/Cargo.toml b/frame/benchmark/Cargo.toml index 7fab3642f2..1c56424151 100644 --- a/frame/benchmark/Cargo.toml +++ b/frame/benchmark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-benchmark" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std"] diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index fcc8e0bf92..b963b73483 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,13 +15,13 @@ targets = ["x86_64-unknown-linux-gnu"] linregress = "0.1" paste = "0.1" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api", default-features = false } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface", default-features = false } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime", default-features = false } -sp-std = { version = "2.0.0-dev", path = "../../primitives/std", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-dev"} -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api", default-features = false } +sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../primitives/runtime-interface", default-features = false } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime", default-features = false } +sp-std = { version = "2.0.0-alpha.8", path = "../../primitives/std", default-features = false } +sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-alpha.8"} +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [features] default = [ "std" ] diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index f2a7f46b06..8372880400 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-collective" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index 3350e815b2..0cbd731147 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,23 +17,23 @@ pwasm-utils = { version = "0.12.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } parity-wasm = { version = "0.41.0", default-features = false } wasmi-validation = { version = "0.3.0", default-features = false } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-sandbox = { version = "0.8.0-dev", default-features = false, path = "../../primitives/sandbox" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "common" } -pallet-transaction-payment = { version = "2.0.0-dev", default-features = false, path = "../transaction-payment" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-sandbox = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/sandbox" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-contracts-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "common" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", default-features = false, path = "../transaction-payment" } [dev-dependencies] wabt = "0.9.2" assert_matches = "1.3.0" hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } -pallet-randomness-collective-flip = { version = "2.0.0-dev", path = "../randomness-collective-flip" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../timestamp" } +pallet-randomness-collective-flip = { version = "2.0.0-alpha.8", path = "../randomness-collective-flip" } [features] default = ["std"] diff --git a/frame/contracts/common/Cargo.toml b/frame/contracts/common/Cargo.toml index d834be7437..15f0b8a0e7 100644 --- a/frame/contracts/common/Cargo.toml +++ b/frame/contracts/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-primitives" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # This crate should not rely on any of the frame primitives. codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } [features] default = ["std"] diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index f3d32e7696..f8692de80a 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-dev", path = "../../../primitives/rpc" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-alpha.8", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -pallet-contracts-primitives = { version = "2.0.0-dev", path = "../common" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-dev", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +pallet-contracts-primitives = { version = "2.0.0-alpha.8", path = "../common" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-alpha.8", path = "./runtime-api" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index fdcfb5149a..e9d9e6fdfa 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Runtime API definition required by Contracts RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/runtime" } -pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "../../common" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/runtime" } +pallet-contracts-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "../../common" } [features] default = ["std"] diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 5c339d2bc5..e506561411 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-democracy" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-scheduler = { version = "2.0.0-dev", path = "../scheduler" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-scheduler = { version = "2.0.0-alpha.8", path = "../scheduler" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } +substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } hex-literal = "0.2.1" [features] diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index f9a3ec0b21..fc7c6c7993 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections-phragmen" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/phragmen" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } [features] default = ["std"] diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index 3109a13392..0eb99ad94e 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index c7aea6eb9b..124ee92ca8 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-evm" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } +pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } primitive-types = { version = "0.7.0", default-features = false, features = ["rlp"] } rlp = { version = "0.4", default-features = false } evm = { version = "0.16", default-features = false } diff --git a/frame/example-offchain-worker/Cargo.toml b/frame/example-offchain-worker/Cargo.toml index 30381adb49..5953240a4b 100644 --- a/frame/example-offchain-worker/Cargo.toml +++ b/frame/example-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example-offchain-worker" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -13,13 +13,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } lite-json = { version = "0.1", default-features = false } [features] diff --git a/frame/example/Cargo.toml b/frame/example/Cargo.toml index d12b1e7c83..16b05180bb 100644 --- a/frame/example/Cargo.toml +++ b/frame/example/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index 84918f7361..cb0efafac1 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-executive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,22 +13,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../../primitives/tracing" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/tracing" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } [dev-dependencies] hex-literal = "0.2.1" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io ={ path = "../../primitives/io", version = "2.0.0-dev"} -pallet-indices = { version = "2.0.0-dev", path = "../indices" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-io ={ path = "../../primitives/io", version = "2.0.0-alpha.8"} +pallet-indices = { version = "2.0.0-alpha.8", path = "../indices" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../transaction-payment" } +sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } [features] default = ["std"] diff --git a/frame/finality-tracker/Cargo.toml b/frame/finality-tracker/Cargo.toml index 9c2019bfb5..b0bf31304c 100644 --- a/frame/finality-tracker/Cargo.toml +++ b/frame/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,17 +16,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-tracker" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/finality-tracker" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/generic-asset/Cargo.toml b/frame/generic-asset/Cargo.toml index 9b32d718ac..97c37fae37 100644 --- a/frame/generic-asset/Cargo.toml +++ b/frame/generic-asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-generic-asset" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Centrality Developers "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index 7a9a00a282..3ee12a4aab 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-grandpa" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,27 +14,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-finality-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-grandpa" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../finality-tracker" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-finality-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/finality-grandpa" } +sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/session" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } +pallet-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../finality-tracker" } [dev-dependencies] grandpa = { package = "finality-grandpa", version = "0.12.3", features = ["derive-codec"] } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-offences = { version = "2.0.0-dev", path = "../offences" } -pallet-staking = { version = "2.0.0-dev", path = "../staking" } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-offences = { version = "2.0.0-alpha.8", path = "../offences" } +pallet-staking = { version = "2.0.0-alpha.8", path = "../staking" } +pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../timestamp" } [features] default = ["std"] diff --git a/frame/identity/Cargo.toml b/frame/identity/Cargo.toml index bfe2a7d492..9d36a235e0 100644 --- a/frame/identity/Cargo.toml +++ b/frame/identity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-identity" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/im-online/Cargo.toml b/frame/im-online/Cargo.toml index 964bd2f69a..7c93b25e35 100644 --- a/frame/im-online/Cargo.toml +++ b/frame/im-online/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-im-online" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME's I'm online pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +pallet-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../authorship" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std", "pallet-session/historical"] diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index db0f4cbf55..7a747ed294 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-indices" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../primitives/keyring" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-keyring = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/keyring" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/membership/Cargo.toml b/frame/membership/Cargo.toml index befca54ad1..538c63acbb 100644 --- a/frame/membership/Cargo.toml +++ b/frame/membership/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-membership" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index 1241c3b4ab..bbf2839341 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-metadata" -version = "11.0.0-dev" +version = "11.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/nicks/Cargo.toml b/frame/nicks/Cargo.toml index 140a48523b..24fd06e454 100644 --- a/frame/nicks/Cargo.toml +++ b/frame/nicks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-nicks" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/offences/Cargo.toml b/frame/offences/Cargo.toml index ebb31d680d..4b5fbb9dbe 100644 --- a/frame/offences/Cargo.toml +++ b/frame/offences/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,18 +12,18 @@ description = "FRAME offences pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } +pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/offences/benchmarking/Cargo.toml b/frame/offences/benchmarking/Cargo.toml index ff77497db0..f18865a45a 100644 --- a/frame/offences/benchmarking/Cargo.toml +++ b/frame/offences/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,28 +13,28 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } -pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../babe" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../../balances" } -pallet-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../grandpa" } -pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../im-online" } -pallet-offences = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } -pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -sp-io = { path = "../../../primitives/io", default-features = false, version = "2.0.0-dev"} -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../system" } +pallet-babe = { version = "2.0.0-alpha.8", default-features = false, path = "../../babe" } +pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../../balances" } +pallet-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../grandpa" } +pallet-im-online = { version = "2.0.0-alpha.8", default-features = false, path = "../../im-online" } +pallet-offences = { version = "2.0.0-alpha.8", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } +pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../session" } +pallet-staking = { version = "2.0.0-alpha.8", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +sp-io = { path = "../../../primitives/io", default-features = false, version = "2.0.0-alpha.8"} +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/staking" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } [dev-dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../timestamp" } serde = { version = "1.0.101" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-io ={ path = "../../../primitives/io", version = "2.0.0-alpha.8"} [features] default = ["std"] diff --git a/frame/randomness-collective-flip/Cargo.toml b/frame/randomness-collective-flip/Cargo.toml index 2c6e733cae..efd41d96b0 100644 --- a/frame/randomness-collective-flip/Cargo.toml +++ b/frame/randomness-collective-flip/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-randomness-collective-flip" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] safe-mix = { version = "1.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml index b0a5982714..5d4ea80fca 100644 --- a/frame/recovery/Cargo.toml +++ b/frame/recovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-recovery" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,15 +15,15 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/scheduler/Cargo.toml b/frame/scheduler/Cargo.toml index 6cc9161eea..6fdf61cf93 100644 --- a/frame/scheduler/Cargo.toml +++ b/frame/scheduler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scheduler" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -11,16 +11,16 @@ description = "FRAME example pallet" [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.2.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/scored-pool/Cargo.toml b/frame/scored-pool/Cargo.toml index 83d1402957..e24505355d 100644 --- a/frame/scored-pool/Cargo.toml +++ b/frame/scored-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scored-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index b03eea494a..61fa57521e 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -sp-trie = { optional = true, path = "../../primitives/trie", default-features = false, version = "2.0.0-dev"} -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/session" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } +sp-trie = { optional = true, path = "../../primitives/trie", default-features = false, version = "2.0.0-alpha.8"} +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../primitives/application-crypto" } lazy_static = "1.4.0" [features] diff --git a/frame/session/benchmarking/Cargo.toml b/frame/session/benchmarking/Cargo.toml index d263e1af9a..e06377a0b4 100644 --- a/frame/session/benchmarking/Cargo.toml +++ b/frame/session/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ description = "FRAME sessions pallet benchmarking" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } -pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../system" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../support" } +pallet-staking = { version = "2.0.0-alpha.8", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../session" } [dev-dependencies] serde = { version = "1.0.101" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} -pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } -pallet-balances = { version = "2.0.0-dev", path = "../../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../../staking/reward-curve" } +sp-io ={ path = "../../../primitives/io", version = "2.0.0-alpha.8"} +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../timestamp" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../../balances" } [features] default = ["std"] diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index 24380aff55..00f5aa651b 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-society" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } rand_chacha = { version = "0.2", default-features = false } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 022baa0f13..38fb18b56a 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,35 +14,35 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io", default-features = false } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-dev", features = ["historical"], path = "../session", default-features = false } -pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-phragmen = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/phragmen" } +sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io", default-features = false } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-alpha.8", features = ["historical"], path = "../session", default-features = false } +pallet-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } static_assertions = "1.1.0" # Optional imports for tesing-utils feature -pallet-indices = { version = "2.0.0-dev", optional = true, path = "../indices", default-features = false } -sp-core = { version = "2.0.0-dev", optional = true, path = "../../primitives/core", default-features = false } +pallet-indices = { version = "2.0.0-alpha.8", optional = true, path = "../indices", default-features = false } +sp-core = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/core", default-features = false } rand = { version = "0.7.3", optional = true, default-features = false } # Optional imports for benchmarking -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } rand_chacha = { version = "0.2", default-features = false, optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../staking/reward-curve" } -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } -frame-benchmarking = { version = "2.0.0-dev", path = "../benchmarking" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../staking/reward-curve" } +substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } +frame-benchmarking = { version = "2.0.0-alpha.8", path = "../benchmarking" } rand_chacha = { version = "0.2" } parking_lot = "0.10.2" env_logger = "0.7.1" diff --git a/frame/staking/fuzzer/Cargo.toml b/frame/staking/fuzzer/Cargo.toml index c717dd8598..9fa74d695d 100644 --- a/frame/staking/fuzzer/Cargo.toml +++ b/frame/staking/fuzzer/Cargo.toml @@ -15,19 +15,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] honggfuzz = "0.5" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -pallet-staking = { version = "2.0.0-dev", path = "..", features = ["testing-utils"] } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../reward-curve" } -pallet-session = { version = "2.0.0-dev", path = "../../session" } -pallet-indices = { version = "2.0.0-dev", path = "../../indices" } -pallet-balances = { version = "2.0.0-dev", path = "../../balances" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } -frame-system = { version = "2.0.0-dev", path = "../../system" } -frame-support = { version = "2.0.0-dev", path = "../../support" } -sp-std = { version = "2.0.0-dev", path = "../../../primitives/std" } -sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-phragmen = { version = "2.0.0-dev", path = "../../../primitives/phragmen" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-alpha.8", path = "..", features = ["testing-utils"] } +pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../reward-curve" } +pallet-session = { version = "2.0.0-alpha.8", path = "../../session" } +pallet-indices = { version = "2.0.0-alpha.8", path = "../../indices" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../../balances" } +pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../timestamp" } +frame-system = { version = "2.0.0-alpha.8", path = "../../system" } +frame-support = { version = "2.0.0-alpha.8", path = "../../support" } +sp-std = { version = "2.0.0-alpha.8", path = "../../../primitives/std" } +sp-io ={ version = "2.0.0-alpha.8", path = "../../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-phragmen = { version = "2.0.0-alpha.8", path = "../../../primitives/phragmen" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } [[bin]] name = "submit_solution" diff --git a/frame/staking/reward-curve/Cargo.toml b/frame/staking/reward-curve/Cargo.toml index b5ec29060a..52ba05e409 100644 --- a/frame/staking/reward-curve/Cargo.toml +++ b/frame/staking/reward-curve/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking-reward-curve" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -21,4 +21,4 @@ proc-macro2 = "1.0.6" proc-macro-crate = "0.1.4" [dev-dependencies] -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } diff --git a/frame/sudo/Cargo.toml b/frame/sudo/Cargo.toml index bbceac1496..1eb8de2cd0 100644 --- a/frame/sudo/Cargo.toml +++ b/frame/sudo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-sudo" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 3213f0dfe4..e2063bf69e 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,24 +15,24 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4" serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-metadata = { version = "11.0.0-dev", default-features = false, path = "../metadata" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../../primitives/tracing" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../../primitives/arithmetic" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -frame-support-procedural = { version = "2.0.0-dev", path = "./procedural" } +frame-metadata = { version = "11.0.0-alpha.8", default-features = false, path = "../metadata" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/tracing" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-arithmetic = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/arithmetic" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +frame-support-procedural = { version = "2.0.0-alpha.8", path = "./procedural" } paste = "0.1.6" once_cell = { version = "1", default-features = false, optional = true } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../primitives/state-machine" } bitmask = { version = "0.5.0", default-features = false } impl-trait-for-tuples = "0.1.3" [dev-dependencies] pretty_assertions = "0.6.1" -frame-system = { version = "2.0.0-dev", path = "../system" } +frame-system = { version = "2.0.0-alpha.8", path = "../system" } [features] default = ["std"] diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 4d05685f9d..6ef28cb75f 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -frame-support-procedural-tools = { version = "2.0.0-dev", path = "./tools" } +frame-support-procedural-tools = { version = "2.0.0-alpha.8", path = "./tools" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full"] } diff --git a/frame/support/procedural/tools/Cargo.toml b/frame/support/procedural/tools/Cargo.toml index 5e5e0eb4c4..d49a90895f 100644 --- a/frame/support/procedural/tools/Cargo.toml +++ b/frame/support/procedural/tools/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Proc macro helpers for procedural macros" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-support-procedural-tools-derive = { version = "2.0.0-dev", path = "./derive" } +frame-support-procedural-tools-derive = { version = "2.0.0-alpha.8", path = "./derive" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full", "visit"] } diff --git a/frame/support/procedural/tools/derive/Cargo.toml b/frame/support/procedural/tools/derive/Cargo.toml index 7cc657e685..f5f9c83b55 100644 --- a/frame/support/procedural/tools/derive/Cargo.toml +++ b/frame/support/procedural/tools/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools-derive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 59014d893c..67e00f3d8d 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ path = "../../../primitives/io", default-features = false , version = "2.0.0-dev"} -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../../primitives/state-machine" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-io ={ path = "../../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} +sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../../primitives/state-machine" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/inherents" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } trybuild = "1.0.17" pretty_assertions = "0.6.1" rustversion = "1.0.0" diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 099290f2c7..9b4424d56a 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-dev"} -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-alpha.8"} +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/version" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] criterion = "0.2.11" -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } [features] default = ["std"] diff --git a/frame/system/benchmarking/Cargo.toml b/frame/system/benchmarking/Cargo.toml index 60ee030011..25a9e8cf86 100644 --- a/frame/system/benchmarking/Cargo.toml +++ b/frame/system/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../benchmarking" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../system" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../support" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } [dev-dependencies] serde = { version = "1.0.101" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} +sp-io ={ path = "../../../primitives/io", version = "2.0.0-alpha.8"} [features] default = ["std"] diff --git a/frame/system/rpc/runtime-api/Cargo.toml b/frame/system/rpc/runtime-api/Cargo.toml index d0644931ae..5d2811abcd 100644 --- a/frame/system/rpc/runtime-api/Cargo.toml +++ b/frame/system/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Runtime API definition required by System RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [features] diff --git a/frame/timestamp/Cargo.toml b/frame/timestamp/Cargo.toml index 49abf80254..e5ac4f1aa7 100644 --- a/frame/timestamp/Cargo.toml +++ b/frame/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-timestamp" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,19 +16,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io", optional = true } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/timestamp" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index 0f8b05c3dd..866d2ceda5 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "./rpc/runtime-api" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "./rpc/runtime-api" } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } [features] default = ["std"] diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index 3851c988e2..f66e2a9f9d 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,10 +16,10 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-dev", path = "../../../primitives/rpc" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-alpha.8", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-alpha.8", path = "./runtime-api" } diff --git a/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/frame/transaction-payment/rpc/runtime-api/Cargo.toml index f8e948ea10..909e526ed3 100644 --- a/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../support" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../support" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/treasury/Cargo.toml b/frame/treasury/Cargo.toml index 9b031c4a0c..9d4a6fb5d2 100644 --- a/frame/treasury/Cargo.toml +++ b/frame/treasury/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-treasury" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index fff5513682..6fc23eb91e 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-utility" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } [features] default = ["std"] diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml index 96282db360..94924c07e2 100644 --- a/frame/vesting/Cargo.toml +++ b/frame/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-vesting" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,17 +15,17 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } hex-literal = "0.2.1" [features] diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml index d56b4e34b2..e3f64cc6c9 100644 --- a/primitives/allocator/Cargo.toml +++ b/primitives/allocator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-allocator" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,9 +13,9 @@ documentation = "https://docs.rs/sp-allocator" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", path = "../std", default-features = false } -sp-core = { version = "2.0.0-dev", path = "../core", default-features = false } -sp-wasm-interface = { version = "2.0.0-dev", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-alpha.8", path = "../std", default-features = false } +sp-core = { version = "2.0.0-alpha.8", path = "../core", default-features = false } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../wasm-interface", default-features = false } log = { version = "0.4.8", optional = true } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index f82bcac77e..8c490673b2 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api-proc-macro = { version = "2.0.0-dev", path = "proc-macro" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../version" } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } +sp-api-proc-macro = { version = "2.0.0-alpha.8", path = "proc-macro" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../version" } +sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../primitives/state-machine" } hash-db = { version = "0.15.2", optional = true } [dev-dependencies] -sp-test-primitives = { version = "2.0.0-dev", path = "../test-primitives" } +sp-test-primitives = { version = "2.0.0-alpha.8", path = "../test-primitives" } [features] default = [ "std" ] diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index 46f804f32c..724a465008 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index 9e2d894a01..8aa77b01ea 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", path = "../" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sp-version = { version = "2.0.0-dev", path = "../../version" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-blockchain = { version = "2.0.0-dev", path = "../../blockchain" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } +sp-api = { version = "2.0.0-alpha.8", path = "../" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +sp-version = { version = "2.0.0-alpha.8", path = "../../version" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../blockchain" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } trybuild = "1.0.17" rustversion = "1.0.0" [dev-dependencies] criterion = "0.3.0" -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sp-core = { version = "2.0.0-dev", path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +sp-core = { version = "2.0.0-alpha.8", path = "../../core" } [[bench]] name = "bench" diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index b350dee843..b48b61a99f 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" description = "Provides facilities for generating application specific crypto wrapper types." @@ -14,11 +14,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } [features] default = [ "std" ] diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index 6e2c81f3a6..b50d035546 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" description = "Integration tests for application-crypto" @@ -13,8 +13,8 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-api = { version = "2.0.0-dev", path = "../../api" } -sp-application-crypto = { version = "2.0.0-dev", path = "../" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-application-crypto = { version = "2.0.0-alpha.8", path = "../" } diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index c22706e32e..0cab74a7b1 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } integer-sqrt = "0.1.2" num-traits = { version = "0.2.8", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-debug-derive = { version = "2.0.0-dev", default-features = false, path = "../../primitives/debug-derive" } +sp-debug-derive = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/debug-derive" } primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index fdcf691762..9180414a3a 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic-fuzzer" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-arithmetic = { version = "2.0.0-dev", path = ".." } +sp-arithmetic = { version = "2.0.0-alpha.8", path = ".." } honggfuzz = "0.5" primitive-types = "0.7.0" num-bigint = "0.2" diff --git a/primitives/authority-discovery/Cargo.toml b/primitives/authority-discovery/Cargo.toml index 286a2e3141..e39e795d1b 100644 --- a/primitives/authority-discovery/Cargo.toml +++ b/primitives/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Authority discovery primitives" edition = "2018" @@ -12,11 +12,11 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", default-features = false, version = "1.3.0" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/authorship/Cargo.toml b/primitives/authorship/Cargo.toml index 0888878ab8..98c3a549de 100644 --- a/primitives/authorship/Cargo.toml +++ b/primitives/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authorship" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Authorship primitives" edition = "2018" @@ -12,9 +12,9 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/block-builder/Cargo.toml b/primitives/block-builder/Cargo.toml index b9793621c9..1875bc08a8 100644 --- a/primitives/block-builder/Cargo.toml +++ b/primitives/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-block-builder" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "The block builder runtime api." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } [features] default = [ "std" ] diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index 9eb619ccb9..3c6cd68170 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-blockchain" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,7 +19,7 @@ lru = "0.4.0" parking_lot = "0.10.0" derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-dev", path = "../consensus/common" } -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } -sp-block-builder = { version = "2.0.0-dev", path = "../block-builder" } -sp-state-machine = { version = "0.8.0-dev", path = "../state-machine" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../consensus/common" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sp-block-builder = { version = "2.0.0-alpha.8", path = "../block-builder" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../state-machine" } diff --git a/primitives/chain-spec/Cargo.toml b/primitives/chain-spec/Cargo.toml index 1d482c5970..2bb950042b 100644 --- a/primitives/chain-spec/Cargo.toml +++ b/primitives/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/consensus/aura/Cargo.toml b/primitives/consensus/aura/Cargo.toml index b907b5689b..f1f61f0957 100644 --- a/primitives/consensus/aura/Cargo.toml +++ b/primitives/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,13 +12,13 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../inherents" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../api" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../inherents" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/babe/Cargo.toml b/primitives/consensus/babe/Cargo.toml index 6a5da2788f..f5b2bf0510 100644 --- a/primitives/consensus/babe/Cargo.toml +++ b/primitives/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" @@ -12,16 +12,16 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } merlin = { version = "2.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } -sp-consensus = { version = "0.8.0-dev", optional = true, path = "../common" } -sp-consensus-vrf = { version = "0.8.0-dev", path = "../vrf", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../inherents" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../api" } +sp-consensus = { version = "0.8.0-alpha.8", optional = true, path = "../common" } +sp-consensus-vrf = { version = "0.8.0-alpha.8", path = "../vrf", default-features = false } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../inherents" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } +sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index ec05e9fba1..ac17421f60 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,22 +17,22 @@ targets = ["x86_64-unknown-linux-gnu"] derive_more = "0.99.2" libp2p = { version = "0.18.1", default-features = false } log = "0.4.8" -sp-core = { path= "../../core", version = "2.0.0-dev"} -sp-inherents = { version = "2.0.0-dev", path = "../../inherents" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-core = { path= "../../core", version = "2.0.0-alpha.8"} +sp-inherents = { version = "2.0.0-alpha.8", path = "../../inherents" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } futures-timer = "3.0.1" -sp-std = { version = "2.0.0-dev", path = "../../std" } -sp-version = { version = "2.0.0-dev", path = "../../version" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../utils" } +sp-std = { version = "2.0.0-alpha.8", path = "../../std" } +sp-version = { version = "2.0.0-alpha.8", path = "../../version" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } +sp-utils = { version = "2.0.0-alpha.8", path = "../../utils" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" serde = { version = "1.0", features = ["derive"] } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} [dev-dependencies] -sp-test-primitives = { version = "2.0.0-dev", path = "../../test-primitives" } +sp-test-primitives = { version = "2.0.0-alpha.8", path = "../../test-primitives" } [features] default = [] diff --git a/primitives/consensus/pow/Cargo.toml b/primitives/consensus/pow/Cargo.toml index aedc50ab51..6e3115258b 100644 --- a/primitives/consensus/pow/Cargo.toml +++ b/primitives/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../api" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/consensus/vrf/Cargo.toml b/primitives/consensus/vrf/Cargo.toml index fce027e7a0..76de25ffd6 100644 --- a/primitives/consensus/vrf/Cargo.toml +++ b/primitives/consensus/vrf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-vrf" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Primitives for VRF based consensus" edition = "2018" @@ -14,9 +14,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { version = "1.0.0", package = "parity-scale-codec", default-features = false } schnorrkel = { version = "0.9.1", features = ["preaudit_deprecated", "u64_backend"], default-features = false } -sp-std = { version = "2.0.0-dev", path = "../../std", default-features = false } -sp-core = { version = "2.0.0-dev", path = "../../core", default-features = false } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } +sp-std = { version = "2.0.0-alpha.8", path = "../../std", default-features = false } +sp-core = { version = "2.0.0-alpha.8", path = "../../core", default-features = false } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } [features] default = ["std"] diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index d028141d3d..23e4d55ca9 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-core" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } log = { version = "0.4.8", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } @@ -33,9 +33,9 @@ num-traits = { version = "0.2.8", default-features = false } zeroize = { version = "1.0.0", default-features = false } lazy_static = { version = "1.4.0", default-features = false, optional = true } parking_lot = { version = "0.10.0", optional = true } -sp-debug-derive = { version = "2.0.0-dev", path = "../debug-derive" } -sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } -sp-storage = { version = "2.0.0-dev", default-features = false, path = "../storage" } +sp-debug-derive = { version = "2.0.0-alpha.8", path = "../debug-derive" } +sp-externalities = { version = "0.8.0-alpha.8", optional = true, path = "../externalities" } +sp-storage = { version = "2.0.0-alpha.8", default-features = false, path = "../storage" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } futures = { version = "0.3.1", optional = true } @@ -50,10 +50,10 @@ twox-hash = { version = "1.5.0", default-features = false, optional = true } libsecp256k1 = { version = "0.3.2", default-features = false, features = ["hmac"], optional = true } merlin = { version = "2.0", default-features = false, optional = true } -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../runtime-interface" } +sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime-interface" } [dev-dependencies] -sp-serializer = { version = "2.0.0-dev", path = "../serializer" } +sp-serializer = { version = "2.0.0-alpha.8", path = "../serializer" } pretty_assertions = "0.6.1" hex-literal = "0.2.1" rand = "0.7.2" diff --git a/primitives/database/Cargo.toml b/primitives/database/Cargo.toml index ef65a8b940..b8ce17c8c6 100644 --- a/primitives/database/Cargo.toml +++ b/primitives/database/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-database" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/debug-derive/Cargo.toml b/primitives/debug-derive/Cargo.toml index d620d2bc71..d099f4917c 100644 --- a/primitives/debug-derive/Cargo.toml +++ b/primitives/debug-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-debug-derive" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 31dde81d7e..443885f94f 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-externalities" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,7 +13,7 @@ documentation = "https://docs.rs/sp-externalities" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-storage = { version = "2.0.0-dev", path = "../storage" } -sp-std = { version = "2.0.0-dev", path = "../std" } +sp-storage = { version = "2.0.0-alpha.8", path = "../storage" } +sp-std = { version = "2.0.0-alpha.8", path = "../std" } environmental = { version = "1.1.1" } codec = { package = "parity-scale-codec", version = "1.3.0" } diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index 36af9319e7..54bbd3deb1 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-grandpa" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } grandpa = { package = "finality-grandpa", version = "0.12.3", default-features = false, features = ["derive-codec"] } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/finality-tracker/Cargo.toml b/primitives/finality-tracker/Cargo.toml index 9e40cb8551..cf8045d0d3 100644 --- a/primitives/finality-tracker/Cargo.toml +++ b/primitives/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } [features] default = ["std"] diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 287f4d7b9d..49180b6192 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-inherents" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = { version = "0.10.0", optional = true } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 2bba4e94cb..df7f6ea1da 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-io" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } hash-db = { version = "0.15.2", default-features = false } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } libsecp256k1 = { version = "0.3.4", optional = true } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../primitives/wasm-interface", default-features = false } -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../runtime-interface" } -sp-trie = { version = "2.0.0-dev", optional = true, path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } +sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../primitives/state-machine" } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../primitives/wasm-interface", default-features = false } +sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime-interface" } +sp-trie = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-alpha.8", optional = true, path = "../externalities" } log = { version = "0.4.8", optional = true } futures = { version = "0.3.1", features = ["thread-pool"], optional = true } parking_lot = { version = "0.10.0", optional = true } diff --git a/primitives/keyring/Cargo.toml b/primitives/keyring/Cargo.toml index b9fe7cb7a0..18e814f311 100644 --- a/primitives/keyring/Cargo.toml +++ b/primitives/keyring/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-keyring" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", path = "../core" } -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } lazy_static = "1.4.0" strum = { version = "0.16.0", features = ["derive"] } diff --git a/primitives/offchain/Cargo.toml b/primitives/offchain/Cargo.toml index 1ed6c3342a..ad2f1ee453 100644 --- a/primitives/offchain/Cargo.toml +++ b/primitives/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers primitives" name = "sp-offchain" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } [dev-dependencies] -sp-state-machine = { version = "0.8.0-dev", default-features = false, path = "../state-machine" } +sp-state-machine = { version = "0.8.0-alpha.8", default-features = false, path = "../state-machine" } [features] default = ["std"] diff --git a/primitives/panic-handler/Cargo.toml b/primitives/panic-handler/Cargo.toml index bc3ef2bdc6..161214d801 100644 --- a/primitives/panic-handler/Cargo.toml +++ b/primitives/panic-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-panic-handler" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/Cargo.toml b/primitives/phragmen/Cargo.toml index 3317b2fac0..071b81a06b 100644 --- a/primitives/phragmen/Cargo.toml +++ b/primitives/phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-phragmen-compact = { version = "2.0.0-dev", path = "./compact" } -sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-phragmen-compact = { version = "2.0.0-alpha.8", path = "./compact" } +sp-arithmetic = { version = "2.0.0-alpha.8", default-features = false, path = "../arithmetic" } [dev-dependencies] -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } rand = "0.7.3" -sp-phragmen = { version = "2.0.0-dev", path = "." } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-alpha.8", path = "." } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } [features] default = ["std"] diff --git a/primitives/phragmen/compact/Cargo.toml b/primitives/phragmen/compact/Cargo.toml index 1e5afd6c49..d73af49679 100644 --- a/primitives/phragmen/compact/Cargo.toml +++ b/primitives/phragmen/compact/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen-compact" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/fuzzer/Cargo.toml b/primitives/phragmen/fuzzer/Cargo.toml index d81d23c476..5a6b90925f 100644 --- a/primitives/phragmen/fuzzer/Cargo.toml +++ b/primitives/phragmen/fuzzer/Cargo.toml @@ -14,9 +14,9 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-phragmen = { version = "2.0.0-dev", path = ".." } -sp-std = { version = "2.0.0-dev", path = "../../std" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-phragmen = { version = "2.0.0-alpha.8", path = ".." } +sp-std = { version = "2.0.0-alpha.8", path = "../../std" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } honggfuzz = "0.5" rand = { version = "0.7.3", features = ["std", "small_rng"] } diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index 4c9dfb5d7b..ee64741b60 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-rpc" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", features = ["derive"] } -sp-core = { version = "2.0.0-dev", path = "../core" } +sp-core = { version = "2.0.0-alpha.8", path = "../core" } [dev-dependencies] serde_json = "1.0.41" diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index df1b32d73f..75bed6ad7b 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,20 +13,20 @@ documentation = "https://docs.rs/sp-runtime-interface/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-wasm-interface = { version = "2.0.0-dev", path = "../wasm-interface", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../tracing" } -sp-runtime-interface-proc-macro = { version = "2.0.0-dev", path = "proc-macro" } -sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } +sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-tracing = { version = "2.0.0-alpha.8", default-features = false, path = "../tracing" } +sp-runtime-interface-proc-macro = { version = "2.0.0-alpha.8", path = "proc-macro" } +sp-externalities = { version = "0.8.0-alpha.8", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } static_assertions = "1.0.0" primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] -sp-runtime-interface-test-wasm = { version = "2.0.0-dev", path = "test-wasm" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-core = { version = "2.0.0-dev", path = "../core" } -sp-io = { version = "2.0.0-dev", path = "../io" } +sp-runtime-interface-test-wasm = { version = "2.0.0-alpha.8", path = "test-wasm" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-alpha.8", path = "../core" } +sp-io = { version = "2.0.0-alpha.8", path = "../io" } rustversion = "1.0.0" trybuild = "1.0.23" diff --git a/primitives/runtime-interface/proc-macro/Cargo.toml b/primitives/runtime-interface/proc-macro/Cargo.toml index 429168fe7b..d8f39ba645 100644 --- a/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/primitives/runtime-interface/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml index 5bf47afd78..461010f11c 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml +++ b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test-wasm/Cargo.toml b/primitives/runtime-interface/test-wasm/Cargo.toml index 5029d4fa3e..4d9dd1b0b4 100644 --- a/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/primitives/runtime-interface/test-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index 3aab396e2e..6a964dce47 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-dev", path = "../" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sp-runtime-interface-test-wasm = { version = "2.0.0-dev", path = "../test-wasm" } -sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-dev", path = "../test-wasm-deprecated" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-core = { version = "2.0.0-dev", path = "../../core" } -sp-io = { version = "2.0.0-dev", path = "../../io" } +sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } +sp-runtime-interface-test-wasm = { version = "2.0.0-alpha.8", path = "../test-wasm" } +sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-alpha.8", path = "../test-wasm-deprecated" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } +sp-core = { version = "2.0.0-alpha.8", path = "../../core" } +sp-io = { version = "2.0.0-alpha.8", path = "../../io" } tracing = "0.1.13" diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index cc87a21f97..dad1691fcf 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,23 +16,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } -sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../arithmetic" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../io" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } +sp-arithmetic = { version = "2.0.0-alpha.8", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../io" } log = { version = "0.4.8", optional = true } paste = "0.1.6" rand = { version = "0.7.2", optional = true } impl-trait-for-tuples = "0.1.3" -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } hash256-std-hasher = { version = "0.15.2", default-features = false } [dev-dependencies] serde_json = "1.0.41" rand = "0.7.2" -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } [features] bench = [] diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index 73755d17c3..3922897c01 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-sandbox" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,10 +13,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../io" } -sp-wasm-interface = { version = "2.0.0-dev", default-features = false, path = "../wasm-interface" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../io" } +sp-wasm-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../wasm-interface" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [dev-dependencies] diff --git a/primitives/serializer/Cargo.toml b/primitives/serializer/Cargo.toml index ded058caa1..4ad0e350c7 100644 --- a/primitives/serializer/Cargo.toml +++ b/primitives/serializer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-serializer" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index f910d85440..50d930f00b 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-session" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../staking" } -sp-runtime = { version = "2.0.0-dev", optional = true, path = "../runtime" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../staking" } +sp-runtime = { version = "2.0.0-alpha.8", optional = true, path = "../runtime" } [features] default = [ "std" ] diff --git a/primitives/staking/Cargo.toml b/primitives/staking/Cargo.toml index f22e88855d..acf752bcde 100644 --- a/primitives/staking/Cargo.toml +++ b/primitives/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-staking" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 470ad33fc3..b5f20b58de 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-state-machine" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" @@ -18,17 +18,17 @@ parking_lot = "0.10.0" hash-db = "0.15.2" trie-db = "0.20.1" trie-root = "0.16.0" -sp-trie = { version = "2.0.0-dev", path = "../trie" } -sp-core = { version = "2.0.0-dev", path = "../core" } -sp-panic-handler = { version = "2.0.0-dev", path = "../panic-handler" } +sp-trie = { version = "2.0.0-alpha.8", path = "../trie" } +sp-core = { version = "2.0.0-alpha.8", path = "../core" } +sp-panic-handler = { version = "2.0.0-alpha.8", path = "../panic-handler" } codec = { package = "parity-scale-codec", version = "1.3.0" } num-traits = "0.2.8" rand = "0.7.2" -sp-externalities = { version = "0.8.0-dev", path = "../externalities" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../externalities" } [dev-dependencies] hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } [features] default = [] diff --git a/primitives/std/Cargo.toml b/primitives/std/Cargo.toml index 8f9d626e25..21588803a5 100644 --- a/primitives/std/Cargo.toml +++ b/primitives/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-std" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/storage/Cargo.toml b/primitives/storage/Cargo.toml index a2ac2b1308..0023278cc8 100644 --- a/primitives/storage/Cargo.toml +++ b/primitives/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-storage" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" description = "Storage related primitives" @@ -13,11 +13,11 @@ documentation = "https://docs.rs/sp-storage/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } impl-serde = { version = "0.2.3", optional = true } ref-cast = "1.0.0" -sp-debug-derive = { version = "2.0.0-dev", path = "../debug-derive" } +sp-debug-derive = { version = "2.0.0-alpha.8", path = "../debug-derive" } [features] default = [ "std" ] diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index b6d4972dd9..79b4dea000 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-test-primitives" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } [features] diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 4279538c24..41ad1fa0b1 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-timestamp" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Substrate core types and inherents for timestamps." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } impl-trait-for-tuples = "0.1.3" wasm-timer = { version = "0.2", optional = true } diff --git a/primitives/tracing/Cargo.toml b/primitives/tracing/Cargo.toml index 2bdf76bc06..64e8225f02 100644 --- a/primitives/tracing/Cargo.toml +++ b/primitives/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-tracing" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/primitives/transaction-pool/Cargo.toml b/primitives/transaction-pool/Cargo.toml index 5acb86ade4..e384325299 100644 --- a/primitives/transaction-pool/Cargo.toml +++ b/primitives/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,9 +19,9 @@ derive_more = { version = "0.99.2", optional = true } futures = { version = "0.3.1", optional = true } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", features = ["derive"], optional = true} -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-utils = { version = "2.0.0-dev", default-features = false, path = "../utils" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-utils = { version = "2.0.0-alpha.8", default-features = false, path = "../utils" } [features] default = [ "std" ] diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index b3cf58ec59..ca459f3057 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-trie" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/substrate/" @@ -18,19 +18,19 @@ harness = false [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } trie-db = { version = "0.20.1", default-features = false } trie-root = { version = "0.16.0", default-features = false } memory-db = { version = "0.20.0", default-features = false } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } [dev-dependencies] trie-bench = "0.21.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } [features] default = ["std"] diff --git a/primitives/utils/Cargo.toml b/primitives/utils/Cargo.toml index 7ed50c9f32..d7efdf4942 100644 --- a/primitives/utils/Cargo.toml +++ b/primitives/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-utils" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index dc9f562ccd..cf23c8f595 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-version" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] impl-serde = { version = "0.2.3", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index d9d17b9edb..b3f468a83a 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-wasm-interface" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } impl-trait-for-tuples = "0.1.2" -sp-std = { version = "2.0.0-dev", path = "../std", default-features = false } +sp-std = { version = "2.0.0-alpha.8", path = "../std", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index e19592a82b..48261b4eeb 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-utils" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index 082d9941d8..5b71bc0051 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-client" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,17 +12,17 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../client/api" } -sc-client-db = { version = "0.8.0-dev", features = ["test-helpers"], path = "../../client/db" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sc-executor = { version = "0.8.0-dev", path = "../../client/executor" } -sc-consensus = { version = "0.8.0-dev", path = "../../client/consensus/common" } -sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../client/service" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../client/api" } +sc-client-db = { version = "0.8.0-alpha.8", features = ["test-helpers"], path = "../../client/db" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../client/executor" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../client/consensus/common" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, features = ["test-helpers"], path = "../../client/service" } futures = "0.3.4" hash-db = "0.15.2" -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 6cd82ce029..2a7cb9a234 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,35 +13,35 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/aura" } -sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } -sp-block-builder = { version = "2.0.0-dev", default-features = false, path = "../../primitives/block-builder" } +sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/aura" } +sp-consensus-babe = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/babe" } +sp-block-builder = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../frame/executive" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../primitives/keyring" } +frame-executive = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/executive" } +sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/keyring" } memory-db = { version = "0.20.0", default-features = false } -sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-dev"} -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-dev"} -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../frame/support" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../frame/babe" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../frame/system" } -frame-system-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../frame/system/rpc/runtime-api" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../frame/timestamp" } -sp-finality-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-grandpa" } -sp-trie = { version = "2.0.0-dev", default-features = false, path = "../../primitives/trie" } -sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../primitives/transaction-pool" } +sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-alpha.8"} +sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-alpha.8"} +sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/support" } +sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/version" } +sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/session" } +sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +pallet-babe = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/babe" } +frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/system" } +frame-system-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/system/rpc/runtime-api" } +pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/timestamp" } +sp-finality-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/finality-grandpa" } +sp-trie = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/trie" } +sp-transaction-pool = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/transaction-pool" } trie-db = { version = "0.20.1", default-features = false } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } -sc-service = { version = "0.8.0-dev", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } # 3rd party cfg-if = "0.1.10" @@ -49,10 +49,10 @@ log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } [dev-dependencies] -sc-block-builder = { version = "0.8.0-dev", path = "../../client/block-builder" } -sc-executor = { version = "0.8.0-dev", path = "../../client/executor" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "./client" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../client/block-builder" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../client/executor" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "./client" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../utils/wasm-builder-runner" } diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index 32091a8e00..87e0884649 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-client" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,16 +12,16 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } -substrate-test-client = { version = "2.0.0-dev", path = "../../client" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } +substrate-test-client = { version = "2.0.0-alpha.8", path = "../../client" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } +sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } futures = "0.3.4" diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml index 3184527308..4f1c816d09 100644 --- a/test-utils/runtime/transaction-pool/Cargo.toml +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../client" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../client" } parking_lot = "0.10.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -sc-transaction-graph = { version = "2.0.0-dev", path = "../../../client/transaction-pool/graph" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } +sc-transaction-graph = { version = "2.0.0-alpha.8", path = "../../../client/transaction-pool/graph" } futures = { version = "0.3.1", features = ["compat"] } derive_more = "0.99.2" diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index ec37c8b139..35e798a392 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-browser-utils" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" @@ -22,11 +22,11 @@ js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" kvdb-web = "0.6" -sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } -sc-informant = { version = "0.8.0-dev", path = "../../client/informant" } -sc-service = { version = "0.8.0-dev", path = "../../client/service", default-features = false } -sc-network = { path = "../../client/network", version = "0.8.0-dev"} -sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-dev"} +sp-database = { version = "2.0.0-alpha.8", path = "../../primitives/database" } +sc-informant = { version = "0.8.0-alpha.8", path = "../../client/informant" } +sc-service = { version = "0.8.0-alpha.8", path = "../../client/service", default-features = false } +sc-network = { path = "../../client/network", version = "0.8.0-alpha.8"} +sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-alpha.8"} # Imported just for the `no_cc` feature clear_on_drop = { version = "0.2.3", features = ["no_cc"] } diff --git a/utils/build-script-utils/Cargo.toml b/utils/build-script-utils/Cargo.toml index 72374a531c..6c3f17be2b 100644 --- a/utils/build-script-utils/Cargo.toml +++ b/utils/build-script-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-build-script-utils" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/fork-tree/Cargo.toml b/utils/fork-tree/Cargo.toml index 7062a61ae5..d663774bd7 100644 --- a/utils/fork-tree/Cargo.toml +++ b/utils/fork-tree/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fork-tree" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/frame/benchmarking-cli/Cargo.toml b/utils/frame/benchmarking-cli/Cargo.toml index fc681bd044..71bd64a0a6 100644 --- a/utils/frame/benchmarking-cli/Cargo.toml +++ b/utils/frame/benchmarking-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking-cli" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,15 +12,15 @@ description = "CLI for benchmarking FRAME" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-benchmarking = { version = "2.0.0-dev", path = "../../../frame/benchmarking" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sc-client-db = { version = "0.8.0-dev", path = "../../../client/db" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +frame-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/benchmarking" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } +sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } +sc-client-db = { version = "0.8.0-alpha.8", path = "../../../client/db" } +sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } +sp-externalities = { version = "0.8.0-alpha.8", path = "../../../primitives/externalities" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } structopt = "0.3.8" codec = { version = "1.3.0", package = "parity-scale-codec" } diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index b086f6aa5f..1dbb8b09a8 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-support" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies ", "Andrew Dirksen "] edition = "2018" license = "Apache-2.0" @@ -17,10 +17,10 @@ jsonrpc-client-transports = { version = "14.0.5", default-features = false, feat jsonrpc-core = "14" codec = { package = "parity-scale-codec", version = "1" } serde = "1" -frame-support = { version = "2.0.0-dev", path = "../../../../frame/support" } -sp-storage = { version = "2.0.0-dev", path = "../../../../primitives/storage" } -sc-rpc-api = { version = "0.8.0-dev", path = "../../../../client/rpc-api" } +frame-support = { version = "2.0.0-alpha.8", path = "../../../../frame/support" } +sp-storage = { version = "2.0.0-alpha.8", path = "../../../../primitives/storage" } +sc-rpc-api = { version = "0.8.0-alpha.8", path = "../../../../client/rpc-api" } [dev-dependencies] -frame-system = { version = "2.0.0-dev", path = "../../../../frame/system" } +frame-system = { version = "2.0.0-alpha.8", path = "../../../../frame/system" } tokio = "0.2" diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 33fd3b399a..991878cef0 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-system" -version = "2.0.0-dev" +version = "2.0.0-alpha.8" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "FRAME's system exposed over Substrate RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../../../client/api" } +sc-client-api = { version = "2.0.0-alpha.8", path = "../../../../client/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.4", features = ["compat"] } jsonrpc-core = "14.0.3" @@ -20,14 +20,14 @@ jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" log = "0.4.8" serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", path = "../../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../../primitives/api" } -frame-system-rpc-runtime-api = { version = "2.0.0-dev", path = "../../../../frame/system/rpc/runtime-api" } -sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../../primitives/blockchain" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../../primitives/transaction-pool" } +sp-runtime = { version = "2.0.0-alpha.8", path = "../../../../primitives/runtime" } +sp-api = { version = "2.0.0-alpha.8", path = "../../../../primitives/api" } +frame-system-rpc-runtime-api = { version = "2.0.0-alpha.8", path = "../../../../frame/system/rpc/runtime-api" } +sp-core = { version = "2.0.0-alpha.8", path = "../../../../primitives/core" } +sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../../primitives/blockchain" } +sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../../primitives/transaction-pool" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../../test-utils/runtime/client" } env_logger = "0.7.0" -sc-transaction-pool = { version = "2.0.0-dev", path = "../../../../client/transaction-pool" } +sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../../client/transaction-pool" } diff --git a/utils/prometheus/Cargo.toml b/utils/prometheus/Cargo.toml index 9ecf5325cd..c425a7c879 100644 --- a/utils/prometheus/Cargo.toml +++ b/utils/prometheus/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Endpoint to expose Prometheus metrics" name = "substrate-prometheus-endpoint" -version = "0.8.0-dev" +version = "0.8.0-alpha.8" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 1291fbf5c711f6b3f26599aa771d8ad8c45efe8d Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Sat, 16 May 2020 12:59:34 +0200 Subject: [PATCH 062/150] Remove on_block_imported (#6039) * remove on_block_imported * Update client/network/src/service.rs Co-authored-by: Pierre Krieger Co-authored-by: Pierre Krieger --- client/network/src/protocol.rs | 32 +++++++++++++++++------------ client/network/src/protocol/sync.rs | 6 +++--- client/network/src/service.rs | 14 +++++++------ client/network/test/src/lib.rs | 6 +----- client/service/src/lib.rs | 2 -- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 7662a476e9..4153129a0a 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -111,7 +111,7 @@ mod rep { /// reputation change should be refunded with `ANY_EXTRINSIC_REFUND` pub const ANY_EXTRINSIC: Rep = Rep::new(-(1 << 4), "Any extrinsic"); /// Reputation change when a peer sends us any extrinsic that is not invalid. - pub const ANY_EXTRINSIC_REFUND: Rep = Rep::new(1 << 4, "Any extrinsic (refund)"); + pub const ANY_EXTRINSIC_REFUND: Rep = Rep::new(1 << 4, "Any extrinsic (refund)"); /// Reputation change when a peer sends us an extrinsic that we didn't know about. pub const GOOD_EXTRINSIC: Rep = Rep::new(1 << 7, "Good extrinsic"); /// Reputation change when a peer sends us a bad extrinsic. @@ -535,6 +535,12 @@ impl Protocol { self.sync.num_sync_requests() } + /// Sync local state with the blockchain state. + pub fn update_chain(&mut self) { + let info = self.context_data.chain.info(); + self.sync.update_chain_info(&info.best_hash, info.best_number); + } + /// Accepts a response from the legacy substream and determines what the corresponding /// request was. fn handle_response( @@ -1419,17 +1425,6 @@ impl Protocol { } } - /// Call this when a block has been imported in the import queue - pub fn on_block_imported(&mut self, header: &B::Header, is_best: bool) { - if is_best { - self.sync.update_chain_info(header); - self.behaviour.set_notif_protocol_handshake( - &self.block_announces_protocol, - BlockAnnouncesHandshake::build(&self.config, &self.context_data.chain).encode() - ); - } - } - /// Call this when a block has been finalized. The sync layer may have some additional /// requesting to perform. pub fn on_block_finalized(&mut self, hash: B::Hash, header: &B::Header) { @@ -1494,12 +1489,23 @@ impl Protocol { /// A batch of blocks have been processed, with or without errors. /// Call this when a batch of blocks have been processed by the importqueue, with or without /// errors. - pub fn blocks_processed( + pub fn on_blocks_processed( &mut self, imported: usize, count: usize, results: Vec<(Result>, BlockImportError>, B::Hash)> ) { + let new_best = results.iter().rev().find_map(|r| match r { + (Ok(BlockImportResult::ImportedUnknown(n, aux, _)), hash) if aux.is_new_best => Some((*n, hash.clone())), + _ => None, + }); + if let Some((best_num, best_hash)) = new_best { + self.sync.update_chain_info(&best_hash, best_num); + self.behaviour.set_notif_protocol_handshake( + &self.block_announces_protocol, + BlockAnnouncesHandshake::build(&self.config, &self.context_data.chain).encode() + ); + } let results = self.sync.on_blocks_processed( imported, count, diff --git a/client/network/src/protocol/sync.rs b/client/network/src/protocol/sync.rs index f4c935de5d..e08fcf4e9b 100644 --- a/client/network/src/protocol/sync.rs +++ b/client/network/src/protocol/sync.rs @@ -513,10 +513,10 @@ impl ChainSync { } } - /// Signal that `best_header` has been queued for import and update the + /// Signal that a new best block has been imported. /// `ChainSync` state with that information. - pub fn update_chain_info(&mut self, best_header: &B::Header) { - self.on_block_queued(&best_header.hash(), *best_header.number()) + pub fn update_chain_info(&mut self, best_hash: &B::Hash, best_number: NumberFor) { + self.on_block_queued(best_hash, best_number); } /// Schedule a justification request for the given block. diff --git a/client/network/src/service.rs b/client/network/src/service.rs index ba6c7a39b4..5448568930 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -400,16 +400,18 @@ impl NetworkWorker { &self.service } - /// You must call this when a new block is imported by the client. - pub fn on_block_imported(&mut self, header: B::Header, is_best: bool) { - self.network_service.user_protocol_mut().on_block_imported(&header, is_best); - } - /// You must call this when a new block is finalized by the client. pub fn on_block_finalized(&mut self, hash: B::Hash, header: B::Header) { self.network_service.user_protocol_mut().on_block_finalized(hash, &header); } + /// This should be called when blocks are added to the + /// chain by something other than the import queue. + /// Currently this is only useful for tests. + pub fn update_chain(&mut self) { + self.network_service.user_protocol_mut().update_chain(); + } + /// Returns the local `PeerId`. pub fn local_peer_id(&self) -> &PeerId { Swarm::::local_peer_id(&self.network_service) @@ -1349,7 +1351,7 @@ impl<'a, B: BlockT, H: ExHashT> Link for NetworkLink<'a, B, H> { count: usize, results: Vec<(Result>, BlockImportError>, B::Hash)> ) { - self.protocol.user_protocol_mut().blocks_processed(imported, count, results) + self.protocol.user_protocol_mut().on_blocks_processed(imported, count, results) } fn justification_imported(&mut self, who: PeerId, hash: &B::Hash, number: NumberFor, success: bool) { self.protocol.user_protocol_mut().justification_import_result(hash.clone(), number, success); diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 76bc2afa69..25a7f3a606 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -295,11 +295,11 @@ impl Peer { Default::default() }; self.block_import.import_block(import_block, cache).expect("block_import failed"); - self.network.on_block_imported(header, true); self.network.service().announce_block(hash, Vec::new()); at = hash; } + self.network.update_chain(); self.network.service().announce_block(at.clone(), Vec::new()); at } @@ -813,10 +813,6 @@ pub trait TestNetFactory: Sized { // We poll `imported_blocks_stream`. while let Poll::Ready(Some(notification)) = peer.imported_blocks_stream.as_mut().poll_next(cx) { - peer.network.on_block_imported( - notification.header, - true, - ); peer.network.service().announce_block(notification.hash, Vec::new()); } diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index ebd2b99ef1..5604b98e82 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -369,8 +369,6 @@ fn build_network_future< // We poll `imported_blocks_stream`. while let Poll::Ready(Some(notification)) = Pin::new(&mut imported_blocks_stream).poll_next(cx) { - network.on_block_imported(notification.header, notification.is_new_best); - if announce_imported_blocks { network.service().announce_block(notification.hash, Vec::new()); } -- GitLab From 6d91909fabb0810b11a0c82aadb5dee41ac08ec8 Mon Sep 17 00:00:00 2001 From: Rakan Alhneiti Date: Sat, 16 May 2020 19:00:58 +0200 Subject: [PATCH 063/150] Aura fix: make sure the key exists locally (#6054) * Fix AURA * Add test to make sure claim slot works as expected --- client/consensus/aura/src/lib.rs | 62 +++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 7fc788e85b..ae88c1707b 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -246,7 +246,13 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW slot_number: u64, epoch_data: &Self::EpochData, ) -> Option { - slot_author::

(slot_number, epoch_data).cloned() + let expected_author = slot_author::

(slot_number, epoch_data); + expected_author.and_then(|p| { + self.keystore.read() + .key_pair_by_type::

(&p, sp_application_crypto::key_types::AURA).ok() + }).and_then(|p| { + Some(p.public()) + }) } fn pre_digest_data( @@ -859,8 +865,11 @@ mod tests { use sp_keyring::sr25519::Keyring; use sc_client_api::BlockchainEvents; use sp_consensus_aura::sr25519::AuthorityPair; + use sc_consensus_slots::SimpleSlotWorker; use std::task::Poll; use sc_block_builder::BlockBuilderProvider; + use sp_runtime::traits::Header as _; + use substrate_test_runtime_client::runtime::{Header, H256}; type Error = sp_blockchain::Error; @@ -1044,4 +1053,55 @@ mod tests { Keyring::Charlie.public().into() ]); } + + #[test] + fn current_node_authority_should_claim_slot() { + let net = AuraTestNet::new(4); + + let mut authorities = vec![ + Keyring::Alice.public().into(), + Keyring::Bob.public().into(), + Keyring::Charlie.public().into() + ]; + + let keystore_path = tempfile::tempdir().expect("Creates keystore path"); + let keystore = sc_keystore::Store::open(keystore_path.path(), None).expect("Creates keystore."); + let my_key = keystore.write() + .generate_by_type::(AuthorityPair::ID) + .expect("Key should be created"); + authorities.push(my_key.public()); + + let net = Arc::new(Mutex::new(net)); + + let mut net = net.lock(); + let peer = net.peer(3); + let client = peer.client().as_full().expect("full clients are created").clone(); + let environ = DummyFactory(client.clone()); + + let worker = AuraWorker { + client: client.clone(), + block_import: Arc::new(Mutex::new(client)), + env: environ, + keystore, + sync_oracle: DummyOracle.clone(), + force_authoring: false, + _key_type: PhantomData::, + }; + + let head = Header::new( + 1, + H256::from_low_u64_be(0), + H256::from_low_u64_be(0), + Default::default(), + Default::default() + ); + assert!(worker.claim_slot(&head, 0, &authorities).is_none()); + assert!(worker.claim_slot(&head, 1, &authorities).is_none()); + assert!(worker.claim_slot(&head, 2, &authorities).is_none()); + assert!(worker.claim_slot(&head, 3, &authorities).is_some()); + assert!(worker.claim_slot(&head, 4, &authorities).is_none()); + assert!(worker.claim_slot(&head, 5, &authorities).is_none()); + assert!(worker.claim_slot(&head, 6, &authorities).is_none()); + assert!(worker.claim_slot(&head, 7, &authorities).is_some()); + } } -- GitLab From 8345611570c69134edbad05eab3001e17d9b908c Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Sat, 16 May 2020 19:03:04 +0200 Subject: [PATCH 064/150] resetting to -dev (#6050) --- Cargo.lock | 354 +++++++++--------- bin/node-template/node/Cargo.toml | 40 +- bin/node-template/pallets/template/Cargo.toml | 12 +- bin/node-template/runtime/Cargo.toml | 48 +-- bin/node/bench/Cargo.toml | 18 +- bin/node/browser-testing/Cargo.toml | 6 +- bin/node/cli/Cargo.toml | 120 +++--- bin/node/executor/Cargo.toml | 50 +-- bin/node/inspect/Cargo.toml | 14 +- bin/node/primitives/Cargo.toml | 12 +- bin/node/rpc-client/Cargo.toml | 6 +- bin/node/rpc/Cargo.toml | 38 +- bin/node/runtime/Cargo.toml | 112 +++--- bin/node/testing/Cargo.toml | 68 ++-- bin/utils/chain-spec-builder/Cargo.toml | 10 +- bin/utils/subkey/Cargo.toml | 20 +- client/api/Cargo.toml | 44 +-- client/authority-discovery/Cargo.toml | 24 +- client/basic-authorship/Cargo.toml | 26 +- client/block-builder/Cargo.toml | 20 +- client/chain-spec/Cargo.toml | 14 +- client/chain-spec/derive/Cargo.toml | 2 +- client/cli/Cargo.toml | 32 +- client/consensus/aura/Cargo.toml | 50 +-- client/consensus/babe/Cargo.toml | 58 +-- client/consensus/babe/rpc/Cargo.toml | 26 +- client/consensus/common/Cargo.toml | 10 +- client/consensus/epochs/Cargo.toml | 10 +- client/consensus/manual-seal/Cargo.toml | 26 +- client/consensus/pow/Cargo.toml | 24 +- client/consensus/slots/Cargo.toml | 24 +- client/consensus/uncles/Cargo.toml | 14 +- client/db/Cargo.toml | 28 +- client/executor/Cargo.toml | 36 +- client/executor/common/Cargo.toml | 12 +- client/executor/runtime-test/Cargo.toml | 14 +- client/executor/wasmi/Cargo.toml | 12 +- client/executor/wasmtime/Cargo.toml | 12 +- client/finality-grandpa/Cargo.toml | 54 +-- client/finality-grandpa/rpc/Cargo.toml | 6 +- client/informant/Cargo.toml | 12 +- client/keystore/Cargo.toml | 6 +- client/network-gossip/Cargo.toml | 8 +- client/network/Cargo.toml | 32 +- client/network/test/Cargo.toml | 26 +- client/offchain/Cargo.toml | 26 +- client/peerset/Cargo.toml | 4 +- client/rpc-api/Cargo.toml | 14 +- client/rpc-servers/Cargo.toml | 4 +- client/rpc/Cargo.toml | 44 +-- client/service/Cargo.toml | 68 ++-- client/service/test/Cargo.toml | 40 +- client/state-db/Cargo.toml | 6 +- client/telemetry/Cargo.toml | 2 +- client/tracing/Cargo.toml | 4 +- client/transaction-pool/Cargo.toml | 28 +- client/transaction-pool/graph/Cargo.toml | 14 +- frame/assets/Cargo.toml | 14 +- frame/aura/Cargo.toml | 26 +- frame/authority-discovery/Cargo.toml | 22 +- frame/authorship/Cargo.toml | 18 +- frame/babe/Cargo.toml | 30 +- frame/balances/Cargo.toml | 18 +- frame/benchmark/Cargo.toml | 14 +- frame/benchmarking/Cargo.toml | 16 +- frame/collective/Cargo.toml | 18 +- frame/contracts/Cargo.toml | 26 +- frame/contracts/common/Cargo.toml | 6 +- frame/contracts/rpc/Cargo.toml | 16 +- frame/contracts/rpc/runtime-api/Cargo.toml | 10 +- frame/democracy/Cargo.toml | 24 +- frame/elections-phragmen/Cargo.toml | 22 +- frame/elections/Cargo.toml | 16 +- frame/evm/Cargo.toml | 18 +- frame/example-offchain-worker/Cargo.toml | 14 +- frame/example/Cargo.toml | 18 +- frame/executive/Cargo.toml | 26 +- frame/finality-tracker/Cargo.toml | 18 +- frame/generic-asset/Cargo.toml | 14 +- frame/grandpa/Cargo.toml | 38 +- frame/identity/Cargo.toml | 18 +- frame/im-online/Cargo.toml | 24 +- frame/indices/Cargo.toml | 18 +- frame/membership/Cargo.toml | 14 +- frame/metadata/Cargo.toml | 6 +- frame/nicks/Cargo.toml | 16 +- frame/offences/Cargo.toml | 18 +- frame/offences/benchmarking/Cargo.toml | 38 +- frame/randomness-collective-flip/Cargo.toml | 14 +- frame/recovery/Cargo.toml | 16 +- frame/scheduler/Cargo.toml | 16 +- frame/scored-pool/Cargo.toml | 16 +- frame/session/Cargo.toml | 24 +- frame/session/benchmarking/Cargo.toml | 26 +- frame/society/Cargo.toml | 16 +- frame/staking/Cargo.toml | 42 +-- frame/staking/fuzzer/Cargo.toml | 26 +- frame/staking/reward-curve/Cargo.toml | 4 +- frame/sudo/Cargo.toml | 14 +- frame/support/Cargo.toml | 24 +- frame/support/procedural/Cargo.toml | 4 +- frame/support/procedural/tools/Cargo.toml | 4 +- .../procedural/tools/derive/Cargo.toml | 2 +- frame/support/test/Cargo.toml | 14 +- frame/system/Cargo.toml | 18 +- frame/system/benchmarking/Cargo.toml | 16 +- frame/system/rpc/runtime-api/Cargo.toml | 4 +- frame/timestamp/Cargo.toml | 22 +- frame/transaction-payment/Cargo.toml | 20 +- frame/transaction-payment/rpc/Cargo.toml | 14 +- .../rpc/runtime-api/Cargo.toml | 10 +- frame/treasury/Cargo.toml | 18 +- frame/utility/Cargo.toml | 20 +- frame/vesting/Cargo.toml | 20 +- primitives/allocator/Cargo.toml | 8 +- primitives/api/Cargo.toml | 16 +- primitives/api/proc-macro/Cargo.toml | 2 +- primitives/api/test/Cargo.toml | 22 +- primitives/application-crypto/Cargo.toml | 8 +- primitives/application-crypto/test/Cargo.toml | 12 +- primitives/arithmetic/Cargo.toml | 6 +- primitives/arithmetic/fuzzer/Cargo.toml | 4 +- primitives/authority-discovery/Cargo.toml | 10 +- primitives/authorship/Cargo.toml | 8 +- primitives/block-builder/Cargo.toml | 10 +- primitives/blockchain/Cargo.toml | 10 +- primitives/chain-spec/Cargo.toml | 2 +- primitives/consensus/aura/Cargo.toml | 14 +- primitives/consensus/babe/Cargo.toml | 18 +- primitives/consensus/common/Cargo.toml | 20 +- primitives/consensus/pow/Cargo.toml | 10 +- primitives/consensus/vrf/Cargo.toml | 8 +- primitives/core/Cargo.toml | 14 +- primitives/database/Cargo.toml | 2 +- primitives/debug-derive/Cargo.toml | 2 +- primitives/externalities/Cargo.toml | 6 +- primitives/finality-grandpa/Cargo.toml | 12 +- primitives/finality-tracker/Cargo.toml | 6 +- primitives/inherents/Cargo.toml | 6 +- primitives/io/Cargo.toml | 16 +- primitives/keyring/Cargo.toml | 6 +- primitives/offchain/Cargo.toml | 10 +- primitives/panic-handler/Cargo.toml | 2 +- primitives/phragmen/Cargo.toml | 14 +- primitives/phragmen/compact/Cargo.toml | 2 +- primitives/phragmen/fuzzer/Cargo.toml | 6 +- primitives/rpc/Cargo.toml | 4 +- primitives/runtime-interface/Cargo.toml | 20 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../test-wasm-deprecated/Cargo.toml | 10 +- .../runtime-interface/test-wasm/Cargo.toml | 10 +- primitives/runtime-interface/test/Cargo.toml | 18 +- primitives/runtime/Cargo.toml | 16 +- primitives/sandbox/Cargo.toml | 10 +- primitives/serializer/Cargo.toml | 2 +- primitives/session/Cargo.toml | 12 +- primitives/staking/Cargo.toml | 6 +- primitives/state-machine/Cargo.toml | 12 +- primitives/std/Cargo.toml | 2 +- primitives/storage/Cargo.toml | 6 +- primitives/test-primitives/Cargo.toml | 8 +- primitives/timestamp/Cargo.toml | 10 +- primitives/tracing/Cargo.toml | 2 +- primitives/transaction-pool/Cargo.toml | 8 +- primitives/trie/Cargo.toml | 8 +- primitives/utils/Cargo.toml | 2 +- primitives/version/Cargo.toml | 6 +- primitives/wasm-interface/Cargo.toml | 4 +- test-utils/Cargo.toml | 2 +- test-utils/client/Cargo.toml | 24 +- test-utils/runtime/Cargo.toml | 60 +-- test-utils/runtime/client/Cargo.toml | 24 +- .../runtime/transaction-pool/Cargo.toml | 12 +- utils/browser/Cargo.toml | 12 +- utils/build-script-utils/Cargo.toml | 2 +- utils/fork-tree/Cargo.toml | 2 +- utils/frame/benchmarking-cli/Cargo.toml | 20 +- utils/frame/rpc/support/Cargo.toml | 10 +- utils/frame/rpc/system/Cargo.toml | 20 +- utils/prometheus/Cargo.toml | 2 +- 180 files changed, 1761 insertions(+), 1761 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eac3ec0562..5c50933839 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -586,7 +586,7 @@ dependencies = [ [[package]] name = "chain-spec-builder" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "ansi_term 0.12.1", "node-cli", @@ -1405,14 +1405,14 @@ checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" [[package]] name = "fork-tree" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", ] [[package]] name = "frame-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -1428,7 +1428,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1445,7 +1445,7 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -1465,7 +1465,7 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-alpha.8" +version = "11.0.0-dev" dependencies = [ "parity-scale-codec", "serde", @@ -1475,7 +1475,7 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "bitmask", "frame-metadata", @@ -1500,7 +1500,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support-procedural-tools", "proc-macro2", @@ -1510,7 +1510,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1521,7 +1521,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -1530,7 +1530,7 @@ dependencies = [ [[package]] name = "frame-support-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "parity-scale-codec", @@ -1547,7 +1547,7 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "criterion 0.2.11", "frame-support", @@ -1565,7 +1565,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -1580,7 +1580,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-api", @@ -3368,7 +3368,7 @@ dependencies = [ [[package]] name = "node-bench" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "fs_extra", @@ -3397,7 +3397,7 @@ dependencies = [ [[package]] name = "node-browser-testing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -3414,7 +3414,7 @@ dependencies = [ [[package]] name = "node-cli" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "assert_cmd", "frame-benchmarking-cli", @@ -3488,7 +3488,7 @@ dependencies = [ [[package]] name = "node-executor" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "criterion 0.3.1", "frame-benchmarking", @@ -3522,7 +3522,7 @@ dependencies = [ [[package]] name = "node-inspect" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "log", @@ -3538,7 +3538,7 @@ dependencies = [ [[package]] name = "node-primitives" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-system", "parity-scale-codec", @@ -3551,7 +3551,7 @@ dependencies = [ [[package]] name = "node-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "jsonrpc-core", "node-primitives", @@ -3576,7 +3576,7 @@ dependencies = [ [[package]] name = "node-rpc-client" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "env_logger 0.7.1", "futures 0.1.29", @@ -3589,7 +3589,7 @@ dependencies = [ [[package]] name = "node-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-executive", @@ -3655,7 +3655,7 @@ dependencies = [ [[package]] name = "node-template" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "log", @@ -3684,7 +3684,7 @@ dependencies = [ [[package]] name = "node-template-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-executive", "frame-support", @@ -3716,7 +3716,7 @@ dependencies = [ [[package]] name = "node-testing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "criterion 0.3.1", "frame-support", @@ -3929,7 +3929,7 @@ dependencies = [ [[package]] name = "pallet-assets" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -3943,7 +3943,7 @@ dependencies = [ [[package]] name = "pallet-aura" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -3965,7 +3965,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -3983,7 +3983,7 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -3999,7 +3999,7 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4021,7 +4021,7 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4037,7 +4037,7 @@ dependencies = [ [[package]] name = "pallet-benchmark" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4051,7 +4051,7 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4068,7 +4068,7 @@ dependencies = [ [[package]] name = "pallet-contracts" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "assert_matches", "frame-support", @@ -4094,7 +4094,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -4103,7 +4103,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4122,7 +4122,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4133,7 +4133,7 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4153,7 +4153,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4169,7 +4169,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4188,7 +4188,7 @@ dependencies = [ [[package]] name = "pallet-evm" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "evm", "frame-support", @@ -4208,7 +4208,7 @@ dependencies = [ [[package]] name = "pallet-example" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4224,7 +4224,7 @@ dependencies = [ [[package]] name = "pallet-example-offchain-worker" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4239,7 +4239,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4256,7 +4256,7 @@ dependencies = [ [[package]] name = "pallet-generic-asset" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4270,7 +4270,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "finality-grandpa", "frame-support", @@ -4297,7 +4297,7 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4314,7 +4314,7 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4333,7 +4333,7 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4349,7 +4349,7 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4363,7 +4363,7 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4378,7 +4378,7 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4394,7 +4394,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4419,7 +4419,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4433,7 +4433,7 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "enumflags2", "frame-support", @@ -4449,7 +4449,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4464,7 +4464,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4479,7 +4479,7 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4500,7 +4500,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4520,7 +4520,7 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4536,7 +4536,7 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "env_logger 0.7.1", "frame-benchmarking", @@ -4589,7 +4589,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4600,7 +4600,7 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4614,7 +4614,7 @@ dependencies = [ [[package]] name = "pallet-template" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4626,7 +4626,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4644,7 +4644,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -4660,7 +4660,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4677,7 +4677,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "parity-scale-codec", @@ -4690,7 +4690,7 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4706,7 +4706,7 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-benchmarking", "frame-support", @@ -4722,7 +4722,7 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5846,7 +5846,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "bytes 0.5.4", "derive_more", @@ -5876,7 +5876,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5917,7 +5917,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5942,7 +5942,7 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "ansi_term 0.12.1", "app_dirs", @@ -5984,7 +5984,7 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "fnv", @@ -6022,7 +6022,7 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "blake2-rfc", "env_logger 0.7.1", @@ -6055,7 +6055,7 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6065,7 +6065,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "env_logger 0.7.1", @@ -6103,7 +6103,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "env_logger 0.7.1", @@ -6153,7 +6153,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "futures 0.3.4", @@ -6178,7 +6178,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6190,7 +6190,7 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "assert_matches", "derive_more", @@ -6220,7 +6220,7 @@ dependencies = [ [[package]] name = "sc-consensus-pow" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "futures 0.3.4", @@ -6241,7 +6241,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -6263,7 +6263,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "log", "sc-client-api", @@ -6276,7 +6276,7 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "assert_matches", "derive_more", @@ -6311,7 +6311,7 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "log", @@ -6327,7 +6327,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "log", "parity-scale-codec", @@ -6341,7 +6341,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "assert_matches", "cranelift-codegen", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "assert_matches", "derive_more", @@ -6406,7 +6406,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "finality-grandpa", @@ -6423,7 +6423,7 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "ansi_term 0.12.1", "futures 0.3.4", @@ -6439,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "hex", @@ -6454,7 +6454,7 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "assert_matches", "async-std", @@ -6513,7 +6513,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "async-std", "futures 0.3.4", @@ -6531,7 +6531,7 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "env_logger 0.7.1", "futures 0.3.4", @@ -6557,7 +6557,7 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "bytes 0.5.4", "env_logger 0.7.1", @@ -6590,7 +6590,7 @@ dependencies = [ [[package]] name = "sc-peerset" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "libp2p", @@ -6603,7 +6603,7 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "assert_matches", "futures 0.1.29", @@ -6642,7 +6642,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "futures 0.3.4", @@ -6665,7 +6665,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6679,7 +6679,7 @@ dependencies = [ [[package]] name = "sc-runtime-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "sp-allocator", "sp-core", @@ -6692,7 +6692,7 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "exit-future", @@ -6753,7 +6753,7 @@ dependencies = [ [[package]] name = "sc-service-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "env_logger 0.7.1", "fdlimit", @@ -6788,7 +6788,7 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "env_logger 0.7.1", "log", @@ -6802,7 +6802,7 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "bytes 0.5.4", "futures 0.3.4", @@ -6823,7 +6823,7 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "erased-serde", "log", @@ -6838,7 +6838,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "assert_matches", "criterion 0.3.1", @@ -6861,7 +6861,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "assert_matches", "derive_more", @@ -7230,7 +7230,7 @@ dependencies = [ [[package]] name = "sp-allocator" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "log", @@ -7241,7 +7241,7 @@ dependencies = [ [[package]] name = "sp-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "hash-db", "parity-scale-codec", @@ -7256,7 +7256,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7267,7 +7267,7 @@ dependencies = [ [[package]] name = "sp-api-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "criterion 0.3.1", "parity-scale-codec", @@ -7286,7 +7286,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "serde", @@ -7297,7 +7297,7 @@ dependencies = [ [[package]] name = "sp-application-crypto-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "sp-api", "sp-application-crypto", @@ -7308,7 +7308,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "criterion 0.3.1", "integer-sqrt", @@ -7324,7 +7324,7 @@ dependencies = [ [[package]] name = "sp-arithmetic-fuzzer" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "honggfuzz", "num-bigint", @@ -7335,7 +7335,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-api", @@ -7346,7 +7346,7 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7356,7 +7356,7 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-api", @@ -7367,7 +7367,7 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "log", @@ -7382,7 +7382,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "serde", "serde_json", @@ -7390,7 +7390,7 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "derive_more", "futures 0.3.4", @@ -7413,7 +7413,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "parity-scale-codec", "sp-api", @@ -7426,7 +7426,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "merlin", "parity-scale-codec", @@ -7442,7 +7442,7 @@ dependencies = [ [[package]] name = "sp-consensus-pow" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "parity-scale-codec", "sp-api", @@ -7453,7 +7453,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7464,7 +7464,7 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "base58", "blake2-rfc", @@ -7510,7 +7510,7 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7518,7 +7518,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -7527,7 +7527,7 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "environmental", "parity-scale-codec", @@ -7537,7 +7537,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "finality-grandpa", "log", @@ -7552,7 +7552,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7561,7 +7561,7 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "parity-scale-codec", @@ -7572,7 +7572,7 @@ dependencies = [ [[package]] name = "sp-io" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "hash-db", @@ -7591,7 +7591,7 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "lazy_static", "sp-core", @@ -7601,7 +7601,7 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "sp-api", "sp-core", @@ -7611,7 +7611,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "backtrace", "log", @@ -7619,7 +7619,7 @@ dependencies = [ [[package]] name = "sp-phragmen" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "rand 0.7.3", @@ -7634,7 +7634,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7655,7 +7655,7 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "serde", "serde_json", @@ -7664,7 +7664,7 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "hash256-std-hasher", "impl-trait-for-tuples", @@ -7686,7 +7686,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7706,7 +7706,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "Inflector", "proc-macro-crate", @@ -7717,7 +7717,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "sc-executor", "sp-core", @@ -7732,7 +7732,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "sp-core", "sp-io", @@ -7743,7 +7743,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "sp-core", "sp-io", @@ -7754,7 +7754,7 @@ dependencies = [ [[package]] name = "sp-sandbox" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "assert_matches", "parity-scale-codec", @@ -7768,7 +7768,7 @@ dependencies = [ [[package]] name = "sp-serializer" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "serde", "serde_json", @@ -7776,7 +7776,7 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-api", @@ -7788,7 +7788,7 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7797,7 +7797,7 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "hash-db", "hex-literal", @@ -7817,11 +7817,11 @@ dependencies = [ [[package]] name = "sp-std" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" [[package]] name = "sp-storage" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7832,7 +7832,7 @@ dependencies = [ [[package]] name = "sp-test-primitives" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "parity-scale-codec", "parity-util-mem", @@ -7844,7 +7844,7 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7857,14 +7857,14 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "tracing", ] [[package]] name = "sp-transaction-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "futures 0.3.4", @@ -7878,7 +7878,7 @@ dependencies = [ [[package]] name = "sp-trie" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "criterion 0.2.11", "hash-db", @@ -7896,7 +7896,7 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "futures-core", @@ -7906,7 +7906,7 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7917,7 +7917,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8032,7 +8032,7 @@ dependencies = [ [[package]] name = "subkey" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "clap", "derive_more", @@ -8074,7 +8074,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "chrono", "clear_on_drop", @@ -8100,14 +8100,14 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-support" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", @@ -8123,7 +8123,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "env_logger 0.7.1", "frame-system-rpc-runtime-api", @@ -8146,7 +8146,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" dependencies = [ "async-std", "derive_more", @@ -8159,7 +8159,7 @@ dependencies = [ [[package]] name = "substrate-test-client" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "hash-db", @@ -8179,7 +8179,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "cfg-if", "frame-executive", @@ -8222,7 +8222,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "futures 0.3.4", "parity-scale-codec", @@ -8241,7 +8241,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" dependencies = [ "derive_more", "futures 0.3.4", @@ -8256,7 +8256,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" [[package]] name = "substrate-wasm-builder" diff --git a/bin/node-template/node/Cargo.toml b/bin/node-template/node/Cargo.toml index c4df4f18a2..030672ee6f 100644 --- a/bin/node-template/node/Cargo.toml +++ b/bin/node-template/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Anonymous"] description = "Substrate Node template" edition = "2018" @@ -21,25 +21,25 @@ log = "0.4.8" structopt = "0.3.8" parking_lot = "0.10.0" -sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } -sc-service = { version = "0.8.0-alpha.8", path = "../../../client/service" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } -sc-network = { version = "0.8.0-alpha.8", path = "../../../client/network" } -sc-consensus-aura = { version = "0.8.0-alpha.8", path = "../../../client/consensus/aura" } -sp-consensus-aura = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/aura" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } -sc-finality-grandpa = { version = "0.8.0-alpha.8", path = "../../../client/finality-grandpa" } -sp-finality-grandpa = { version = "2.0.0-alpha.8", path = "../../../primitives/finality-grandpa" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-alpha.8"} +sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } +sc-service = { version = "0.8.0-dev", path = "../../../client/service" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sc-network = { version = "0.8.0-dev", path = "../../../client/network" } +sc-consensus-aura = { version = "0.8.0-dev", path = "../../../client/consensus/aura" } +sp-consensus-aura = { version = "0.8.0-dev", path = "../../../primitives/consensus/aura" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } +sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } +sp-finality-grandpa = { version = "2.0.0-dev", path = "../../../primitives/finality-grandpa" } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-dev"} -node-template-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +node-template-runtime = { version = "2.0.0-dev", path = "../runtime" } [build-dependencies] -substrate-build-script-utils = { version = "2.0.0-alpha.8", path = "../../../utils/build-script-utils" } +substrate-build-script-utils = { version = "2.0.0-dev", path = "../../../utils/build-script-utils" } diff --git a/bin/node-template/pallets/template/Cargo.toml b/bin/node-template/pallets/template/Cargo.toml index 24f40f4126..01484c608c 100644 --- a/bin/node-template/pallets/template/Cargo.toml +++ b/bin/node-template/pallets/template/Cargo.toml @@ -2,7 +2,7 @@ authors = ['Anonymous'] edition = '2018' name = 'pallet-template' -version = "2.0.0-alpha.8" +version = "2.0.0-dev" license = "Unlicense" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" @@ -16,26 +16,26 @@ codec = { package = "parity-scale-codec", version = "1.3.0", default-features = [dependencies.frame-support] default-features = false -version = "2.0.0-alpha.8" +version = "2.0.0-dev" path = "../../../../frame/support" [dependencies.frame-system] default-features = false -version = "2.0.0-alpha.8" +version = "2.0.0-dev" path = "../../../../frame/system" [dev-dependencies.sp-core] default-features = false -version = "2.0.0-alpha.8" +version = "2.0.0-dev" path = "../../../../primitives/core" [dev-dependencies.sp-io] default-features = false -version = "2.0.0-alpha.8" +version = "2.0.0-dev" path = "../../../../primitives/io" [dev-dependencies.sp-runtime] default-features = false -version = "2.0.0-alpha.8" +version = "2.0.0-dev" path = "../../../../primitives/runtime" diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index b1151c64d9..dfd517130b 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Anonymous"] edition = "2018" license = "Unlicense" @@ -13,31 +13,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -aura = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } -balances = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/support" } -grandpa = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } -randomness-collective-flip = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } -sudo = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } -system = { version = "2.0.0-alpha.8", default-features = false, package = "frame-system", path = "../../../frame/system" } -timestamp = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } -transaction-payment = { version = "2.0.0-alpha.8", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } -frame-executive = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/executive" } +aura = { version = "2.0.0-dev", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } +balances = { version = "2.0.0-dev", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } +grandpa = { version = "2.0.0-dev", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } +randomness-collective-flip = { version = "2.0.0-dev", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } +sudo = { version = "2.0.0-dev", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } +system = { version = "2.0.0-dev", default-features = false, package = "frame-system", path = "../../../frame/system" } +timestamp = { version = "2.0.0-dev", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } +transaction-payment = { version = "2.0.0-dev", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } +frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../../frame/executive" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/api" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-alpha.8"} -sp-consensus-aura = { version = "0.8.0-alpha.8", default-features = false, path = "../../../primitives/consensus/aura" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } -sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-alpha.8"} -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/io" } -sp-offchain = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/offchain" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/session" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } -sp-transaction-pool = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/version" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/api" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-dev"} +sp-consensus-aura = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/consensus/aura" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-dev"} +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/io" } +sp-offchain = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/offchain" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-session = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/session" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/version" } -template = { version = "2.0.0-alpha.8", default-features = false, path = "../pallets/template", package = "pallet-template" } +template = { version = "2.0.0-dev", default-features = false, path = "../pallets/template", package = "pallet-template" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index 443bfaeede..ec72a125bb 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-bench" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate node integration benchmarks." edition = "2018" @@ -10,20 +10,20 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] log = "0.4.8" -node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } -node-testing = { version = "2.0.0-alpha.8", path = "../testing" } -sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api/" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +node-primitives = { version = "2.0.0-dev", path = "../primitives" } +node-testing = { version = "2.0.0-dev", path = "../testing" } +sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } serde = "1.0.101" serde_json = "1.0.41" structopt = "0.3" derive_more = "0.99.2" kvdb = "0.6" kvdb-rocksdb = "0.8" -sp-trie = { version = "2.0.0-alpha.8", path = "../../../primitives/trie" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } hash-db = "0.15.2" tempfile = "3.1.0" fs_extra = "1" diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 2178fc631f..3885aa3b09 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-browser-testing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Tests for the in-browser light client." edition = "2018" @@ -17,5 +17,5 @@ wasm-bindgen-futures = "0.4.10" wasm-bindgen-test = "0.3.10" futures = "0.3.4" -node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-alpha.8"} -sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-alpha.8"} +node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-dev"} +sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-dev"} diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 1e4c9b6be3..281bee8dbb 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-cli" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Generic Substrate node implementation in Rust." build = "build.rs" @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] [badges] travis-ci = { repository = "paritytech/substrate" } -maintenance = { status = "actively-alpha.8eloped" } +maintenance = { status = "actively-developed" } is-it-maintained-issue-resolution = { repository = "paritytech/substrate" } is-it-maintained-open-issues = { repository = "paritytech/substrate" } @@ -46,76 +46,76 @@ tracing = "0.1.10" parking_lot = "0.10.0" # primitives -sp-authority-discovery = { version = "2.0.0-alpha.8", path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } -grandpa-primitives = { version = "2.0.0-alpha.8", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/timestamp" } -sp-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/finality-tracker" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } -sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } -sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } +sp-authority-discovery = { version = "2.0.0-dev", path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } +grandpa-primitives = { version = "2.0.0-dev", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/timestamp" } +sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/finality-tracker" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } # client dependencies -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } -sc-chain-spec = { version = "2.0.0-alpha.8", path = "../../../client/chain-spec" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../client/transaction-pool" } -sc-network = { version = "0.8.0-alpha.8", path = "../../../client/network" } -sc-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../client/consensus/babe" } -grandpa = { version = "0.8.0-alpha.8", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } -sc-client-db = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/db" } -sc-offchain = { version = "2.0.0-alpha.8", path = "../../../client/offchain" } -sc-rpc = { version = "2.0.0-alpha.8", path = "../../../client/rpc" } -sc-basic-authorship = { version = "0.8.0-alpha.8", path = "../../../client/basic-authorship" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } -sc-tracing = { version = "2.0.0-alpha.8", path = "../../../client/tracing" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../../../client/telemetry" } -sc-authority-discovery = { version = "0.8.0-alpha.8", path = "../../../client/authority-discovery" } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } +sc-chain-spec = { version = "2.0.0-dev", path = "../../../client/chain-spec" } +sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../../../client/transaction-pool" } +sc-network = { version = "0.8.0-dev", path = "../../../client/network" } +sc-consensus-babe = { version = "0.8.0-dev", path = "../../../client/consensus/babe" } +grandpa = { version = "0.8.0-dev", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } +sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../../../client/db" } +sc-offchain = { version = "2.0.0-dev", path = "../../../client/offchain" } +sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } +sc-basic-authorship = { version = "0.8.0-dev", path = "../../../client/basic-authorship" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } +sc-tracing = { version = "2.0.0-dev", path = "../../../client/tracing" } +sc-telemetry = { version = "2.0.0-dev", path = "../../../client/telemetry" } +sc-authority-discovery = { version = "0.8.0-dev", path = "../../../client/authority-discovery" } # frame dependencies -pallet-indices = { version = "2.0.0-alpha.8", path = "../../../frame/indices" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/timestamp" } -pallet-contracts = { version = "2.0.0-alpha.8", path = "../../../frame/contracts" } -frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/support" } -pallet-im-online = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/im-online" } -pallet-authority-discovery = { version = "2.0.0-alpha.8", path = "../../../frame/authority-discovery" } -pallet-staking = { version = "2.0.0-alpha.8", path = "../../../frame/staking" } -pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../frame/timestamp" } +pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } +frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } +pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../../frame/im-online" } +pallet-authority-discovery = { version = "2.0.0-dev", path = "../../../frame/authority-discovery" } +pallet-staking = { version = "2.0.0-dev", path = "../../../frame/staking" } +pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } # node-specific dependencies -node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } -node-rpc = { version = "2.0.0-alpha.8", path = "../rpc" } -node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } -node-executor = { version = "2.0.0-alpha.8", path = "../executor" } +node-runtime = { version = "2.0.0-dev", path = "../runtime" } +node-rpc = { version = "2.0.0-dev", path = "../rpc" } +node-primitives = { version = "2.0.0-dev", path = "../primitives" } +node-executor = { version = "2.0.0-dev", path = "../executor" } # CLI-specific dependencies -sc-cli = { version = "0.8.0-alpha.8", optional = true, path = "../../../client/cli" } -frame-benchmarking-cli = { version = "2.0.0-alpha.8", optional = true, path = "../../../utils/frame/benchmarking-cli" } -node-inspect = { version = "0.8.0-alpha.8", optional = true, path = "../inspect" } +sc-cli = { version = "0.8.0-dev", optional = true, path = "../../../client/cli" } +frame-benchmarking-cli = { version = "2.0.0-dev", optional = true, path = "../../../utils/frame/benchmarking-cli" } +node-inspect = { version = "0.8.0-dev", optional = true, path = "../inspect" } # WASM-specific dependencies wasm-bindgen = { version = "0.2.57", optional = true } wasm-bindgen-futures = { version = "0.4.7", optional = true } -browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-alpha.8"} +browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-dev"} [target.'cfg(target_arch="x86_64")'.dependencies] -node-executor = { version = "2.0.0-alpha.8", path = "../executor", features = [ "wasmtime" ] } -sc-cli = { version = "0.8.0-alpha.8", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } +node-executor = { version = "2.0.0-dev", path = "../executor", features = [ "wasmtime" ] } +sc-cli = { version = "0.8.0-dev", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } [dev-dependencies] -sc-keystore = { version = "2.0.0-alpha.8", path = "../../../client/keystore" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } -sc-consensus-babe = { version = "0.8.0-alpha.8", features = ["test-helpers"], path = "../../../client/consensus/babe" } -sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../../../client/consensus/epochs" } -sc-service-test = { version = "2.0.0-alpha.8", path = "../../../client/service/test" } +sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } +sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } +sc-consensus-babe = { version = "0.8.0-dev", features = ["test-helpers"], path = "../../../client/consensus/babe" } +sc-consensus-epochs = { version = "0.8.0-dev", path = "../../../client/consensus/epochs" } +sc-service-test = { version = "2.0.0-dev", path = "../../../client/service/test" } futures = "0.3.4" tempfile = "3.1.0" assert_cmd = "1.0" @@ -126,12 +126,12 @@ platforms = "0.2.1" [build-dependencies] structopt = { version = "0.3.8", optional = true } -node-inspect = { version = "0.8.0-alpha.8", optional = true, path = "../inspect" } -frame-benchmarking-cli = { version = "2.0.0-alpha.8", optional = true, path = "../../../utils/frame/benchmarking-cli" } -substrate-build-script-utils = { version = "2.0.0-alpha.8", optional = true, path = "../../../utils/build-script-utils" } +node-inspect = { version = "0.8.0-dev", optional = true, path = "../inspect" } +frame-benchmarking-cli = { version = "2.0.0-dev", optional = true, path = "../../../utils/frame/benchmarking-cli" } +substrate-build-script-utils = { version = "2.0.0-dev", optional = true, path = "../../../utils/build-script-utils" } [build-dependencies.sc-cli] -version = "0.8.0-alpha.8" +version = "0.8.0-dev" package = "sc-cli" path = "../../../client/cli" optional = true diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 78cfb3e5b4..014ac9a4c8 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-executor" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" @@ -13,34 +13,34 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } -node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../../primitives/trie" } +node-primitives = { version = "2.0.0-dev", path = "../primitives" } +node-runtime = { version = "2.0.0-dev", path = "../runtime" } +sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } trie-root = "0.16.0" -frame-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/benchmarking" } +frame-benchmarking = { version = "2.0.0-dev", path = "../../../frame/benchmarking" } [dev-dependencies] criterion = "0.3.0" -frame-support = { version = "2.0.0-alpha.8", path = "../../../frame/support" } -frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } -node-testing = { version = "2.0.0-alpha.8", path = "../testing" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } -pallet-contracts = { version = "2.0.0-alpha.8", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-alpha.8", path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-alpha.8", path = "../../../frame/indices" } -pallet-session = { version = "2.0.0-alpha.8", path = "../../../frame/session" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-alpha.8", path = "../../../frame/treasury" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-externalities = { version = "0.8.0-alpha.8", path = "../../../primitives/externalities" } -substrate-test-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/client" } +frame-support = { version = "2.0.0-dev", path = "../../../frame/support" } +frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } +node-testing = { version = "2.0.0-dev", path = "../testing" } +pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } +pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-dev", path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } +pallet-session = { version = "2.0.0-dev", path = "../../../frame/session" } +pallet-timestamp = { version = "2.0.0-dev", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-dev", path = "../../../frame/treasury" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } +substrate-test-client = { version = "2.0.0-dev", path = "../../../test-utils/client" } wabt = "0.9.2" [features] diff --git a/bin/node/inspect/Cargo.toml b/bin/node/inspect/Cargo.toml index c16bb0493a..5beb1f948e 100644 --- a/bin/node/inspect/Cargo.toml +++ b/bin/node/inspect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-inspect" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,10 +14,10 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0" } derive_more = "0.99" log = "0.4.8" -sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } structopt = "0.3.8" diff --git a/bin/node/primitives/Cargo.toml b/bin/node/primitives/Cargo.toml index 96f8428a1c..5850db83d4 100644 --- a/bin/node/primitives/Cargo.toml +++ b/bin/node/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-primitives" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,13 +12,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system" } -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/application-crypto" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/application-crypto" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } [dev-dependencies] -sp-serializer = { version = "2.0.0-alpha.8", path = "../../../primitives/serializer" } +sp-serializer = { version = "2.0.0-dev", path = "../../../primitives/serializer" } pretty_assertions = "0.6.1" [features] diff --git a/bin/node/rpc-client/Cargo.toml b/bin/node/rpc-client/Cargo.toml index 80ca0063b2..8ba5aed4aa 100644 --- a/bin/node/rpc-client/Cargo.toml +++ b/bin/node/rpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc-client" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,5 +16,5 @@ futures = "0.1.29" hyper = "0.12.35" jsonrpc-core-client = { version = "14.0.5", default-features = false, features = ["http"] } log = "0.4.8" -node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } -sc-rpc = { version = "2.0.0-alpha.8", path = "../../../client/rpc" } +node-primitives = { version = "2.0.0-dev", path = "../primitives" } +sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index bd8a8bd312..ef948cd009 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -11,22 +11,22 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } jsonrpc-core = "14.0.3" -node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } -node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -pallet-contracts-rpc = { version = "0.8.0-alpha.8", path = "../../../frame/contracts/rpc/" } -pallet-transaction-payment-rpc = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment/rpc/" } -substrate-frame-rpc-system = { version = "2.0.0-alpha.8", path = "../../../utils/frame/rpc/system" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } -sc-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../client/consensus/babe" } -sc-consensus-babe-rpc = { version = "0.8.0-alpha.8", path = "../../../client/consensus/babe/rpc" } -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../../../client/keystore" } -sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../../../client/consensus/epochs" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sc-finality-grandpa = { version = "0.8.0-alpha.8", path = "../../../client/finality-grandpa" } -sc-finality-grandpa-rpc = { version = "0.8.0-alpha.8", path = "../../../client/finality-grandpa/rpc" } +node-primitives = { version = "2.0.0-dev", path = "../primitives" } +node-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +pallet-contracts-rpc = { version = "0.8.0-dev", path = "../../../frame/contracts/rpc/" } +pallet-transaction-payment-rpc = { version = "2.0.0-dev", path = "../../../frame/transaction-payment/rpc/" } +substrate-frame-rpc-system = { version = "2.0.0-dev", path = "../../../utils/frame/rpc/system" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sc-consensus-babe = { version = "0.8.0-dev", path = "../../../client/consensus/babe" } +sc-consensus-babe-rpc = { version = "0.8.0-dev", path = "../../../client/consensus/babe/rpc" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } +sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } +sc-consensus-epochs = { version = "0.8.0-dev", path = "../../../client/consensus/epochs" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } +sc-finality-grandpa-rpc = { version = "0.8.0-dev", path = "../../../client/finality-grandpa/rpc" } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index afcc63d5d7..8ca89367fe 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -20,68 +20,68 @@ serde = { version = "1.0.102", optional = true } static_assertions = "1.1.0" # primitives -sp-authority-discovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-alpha.8", default-features = false, path = "../../../primitives/consensus/babe" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-alpha.8"} -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/inherents" } -node-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "../primitives" } -sp-offchain = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/offchain" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/staking" } -sp-keyring = { version = "2.0.0-alpha.8", optional = true, path = "../../../primitives/keyring" } -sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/session" } -sp-transaction-pool = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/version" } +sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/consensus/babe" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-dev"} +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } +node-primitives = { version = "2.0.0-dev", default-features = false, path = "../primitives" } +sp-offchain = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/offchain" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } +sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../../primitives/keyring" } +sp-session = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/session" } +sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/version" } # frame dependencies -frame-executive = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/executive" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/benchmarking", optional = true } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system" } -frame-system-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system/benchmarking", optional = true } -frame-system-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } -pallet-authority-discovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/authority-discovery" } -pallet-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/authorship" } -pallet-babe = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/babe" } -pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/balances" } -pallet-collective = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/collective" } -pallet-contracts = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/contracts" } -pallet-contracts-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/contracts/common/" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-alpha.8", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } -pallet-democracy = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/democracy" } -pallet-elections-phragmen = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/elections-phragmen" } -pallet-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/finality-tracker" } -pallet-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/indices" } -pallet-identity = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/identity" } -pallet-membership = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/membership" } -pallet-offences = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/offences" } -pallet-offences-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } -pallet-randomness-collective-flip = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/randomness-collective-flip" } -pallet-recovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/recovery" } -pallet-session = { version = "2.0.0-alpha.8", features = ["historical"], path = "../../../frame/session", default-features = false } -pallet-session-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/session/benchmarking", default-features = false, optional = true } -pallet-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/staking" } -pallet-staking-reward-curve = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/staking/reward-curve" } -pallet-scheduler = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/scheduler" } -pallet-society = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/society" } -pallet-sudo = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/sudo" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/timestamp" } -pallet-treasury = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/treasury" } -pallet-utility = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/utility" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/transaction-payment" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } -pallet-vesting = { version = "2.0.0-alpha.8", default-features = false, path = "../../../frame/vesting" } +frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../../frame/executive" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/benchmarking", optional = true } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system" } +frame-system-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system/benchmarking", optional = true } +frame-system-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } +pallet-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../frame/authority-discovery" } +pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../../../frame/authorship" } +pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../../frame/babe" } +pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../../../frame/balances" } +pallet-collective = { version = "2.0.0-dev", default-features = false, path = "../../../frame/collective" } +pallet-contracts = { version = "2.0.0-dev", default-features = false, path = "../../../frame/contracts" } +pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "../../../frame/contracts/common/" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-dev", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } +pallet-democracy = { version = "2.0.0-dev", default-features = false, path = "../../../frame/democracy" } +pallet-elections-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../../frame/elections-phragmen" } +pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../frame/finality-tracker" } +pallet-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-dev", default-features = false, path = "../../../frame/indices" } +pallet-identity = { version = "2.0.0-dev", default-features = false, path = "../../../frame/identity" } +pallet-membership = { version = "2.0.0-dev", default-features = false, path = "../../../frame/membership" } +pallet-offences = { version = "2.0.0-dev", default-features = false, path = "../../../frame/offences" } +pallet-offences-benchmarking = { version = "2.0.0-dev", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } +pallet-randomness-collective-flip = { version = "2.0.0-dev", default-features = false, path = "../../../frame/randomness-collective-flip" } +pallet-recovery = { version = "2.0.0-dev", default-features = false, path = "../../../frame/recovery" } +pallet-session = { version = "2.0.0-dev", features = ["historical"], path = "../../../frame/session", default-features = false } +pallet-session-benchmarking = { version = "2.0.0-dev", path = "../../../frame/session/benchmarking", default-features = false, optional = true } +pallet-staking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/staking" } +pallet-staking-reward-curve = { version = "2.0.0-dev", default-features = false, path = "../../../frame/staking/reward-curve" } +pallet-scheduler = { version = "2.0.0-dev", default-features = false, path = "../../../frame/scheduler" } +pallet-society = { version = "2.0.0-dev", default-features = false, path = "../../../frame/society" } +pallet-sudo = { version = "2.0.0-dev", default-features = false, path = "../../../frame/sudo" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../frame/timestamp" } +pallet-treasury = { version = "2.0.0-dev", default-features = false, path = "../../../frame/treasury" } +pallet-utility = { version = "2.0.0-dev", default-features = false, path = "../../../frame/utility" } +pallet-transaction-payment = { version = "2.0.0-dev", default-features = false, path = "../../../frame/transaction-payment" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } +pallet-vesting = { version = "2.0.0-dev", default-features = false, path = "../../../frame/vesting" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } [dev-dependencies] -sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index 37518ebe80..dded81ac8e 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-testing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Test utilities for Substrate node." edition = "2018" @@ -13,40 +13,40 @@ publish = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } -sc-service = { version = "0.8.0-alpha.8", features = ["test-helpers", "db"], path = "../../../client/service" } -sc-client-db = { version = "0.8.0-alpha.8", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api/" } +pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } +sc-service = { version = "0.8.0-dev", features = ["test-helpers", "db"], path = "../../../client/service" } +sc-client-db = { version = "0.8.0-dev", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } codec = { package = "parity-scale-codec", version = "1.3.0" } -pallet-contracts = { version = "2.0.0-alpha.8", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } -pallet-indices = { version = "2.0.0-alpha.8", path = "../../../frame/indices" } -sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } -node-executor = { version = "2.0.0-alpha.8", path = "../executor" } -node-primitives = { version = "2.0.0-alpha.8", path = "../primitives" } -node-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } -frame-support = { version = "2.0.0-alpha.8", path = "../../../frame/support" } -pallet-session = { version = "2.0.0-alpha.8", path = "../../../frame/session" } -pallet-society = { version = "2.0.0-alpha.8", path = "../../../frame/society" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -pallet-staking = { version = "2.0.0-alpha.8", path = "../../../frame/staking" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor", features = ["wasmtime"] } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } -substrate-test-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/client" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-alpha.8", path = "../../../frame/treasury" } +pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } +sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } +node-executor = { version = "2.0.0-dev", path = "../executor" } +node-primitives = { version = "2.0.0-dev", path = "../primitives" } +node-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +frame-support = { version = "2.0.0-dev", path = "../../../frame/support" } +pallet-session = { version = "2.0.0-dev", path = "../../../frame/session" } +pallet-society = { version = "2.0.0-dev", path = "../../../frame/society" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-dev", path = "../../../frame/staking" } +sc-executor = { version = "0.8.0-dev", path = "../../../client/executor", features = ["wasmtime"] } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } +substrate-test-client = { version = "2.0.0-dev", path = "../../../test-utils/client" } +pallet-timestamp = { version = "2.0.0-dev", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-dev", path = "../../../frame/treasury" } wabt = "0.9.2" -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sp-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/finality-tracker" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/timestamp" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/finality-tracker" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/timestamp" } +sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } log = "0.4.8" tempfile = "3.1.0" fs_extra = "1" @@ -54,4 +54,4 @@ futures = "0.3.1" [dev-dependencies] criterion = "0.3.0" -sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } +sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index d4faa4f1e3..211460400c 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chain-spec-builder" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,9 +13,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" -sc-keystore = { version = "2.0.0-alpha.8", path = "../../../client/keystore" } -sc-chain-spec = { version = "2.0.0-alpha.8", path = "../../../client/chain-spec" } -node-cli = { version = "2.0.0-alpha.8", path = "../../node/cli" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } +sc-chain-spec = { version = "2.0.0-dev", path = "../../../client/chain-spec" } +node-cli = { version = "2.0.0-dev", path = "../../node/cli" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } rand = "0.7.2" structopt = "0.3.8" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 91643b4551..488b0f7fbc 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "subkey" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,10 +12,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.1.29" -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -node-runtime = { version = "2.0.0-alpha.8", path = "../../node/runtime" } -node-primitives = { version = "2.0.0-alpha.8", path = "../../node/primitives" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +node-runtime = { version = "2.0.0-dev", path = "../../node/runtime" } +node-primitives = { version = "2.0.0-dev", path = "../../node/primitives" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } rand = "0.7.2" clap = "2.33.0" tiny-bip39 = "0.7" @@ -23,14 +23,14 @@ substrate-bip39 = "0.4.1" hex = "0.4.0" hex-literal = "0.2.1" codec = { package = "parity-scale-codec", version = "1.3.0" } -frame-system = { version = "2.0.0-alpha.8", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../../../frame/transaction-payment" } -pallet-grandpa = { version = "2.0.0-alpha.8", path = "../../../frame/grandpa" } +frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } +pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } rpassword = "4.0.1" itertools = "0.8.2" derive_more = { version = "0.99.2" } -sc-rpc = { version = "2.0.0-alpha.8", path = "../../../client/rpc" } +sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" libp2p = "0.18.1" diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 9d79e2ca5a..9e983eb966 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,36 +14,36 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } derive_more = { version = "0.99.2" } -sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } -sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } +sc-executor = { version = "0.8.0-dev", path = "../executor" } +sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } fnv = { version = "1.0.6" } futures = { version = "0.3.1" } hash-db = { version = "0.15.2", default-features = false } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } kvdb = "0.6.0" log = { version = "0.4.8" } parking_lot = "0.10.0" lazy_static = "1.4.0" -sp-database = { version = "2.0.0-alpha.8", path = "../../primitives/database" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/version" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-alpha.8", path = "../../utils/prometheus" } +sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } +sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } [dev-dependencies] kvdb-memorydb = "0.6.0" -sp-test-primitives = { version = "2.0.0-alpha.8", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime" } +sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index ad567bf0e6..d2b74b51e1 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-authority-discovery" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -23,21 +23,21 @@ futures = "0.3.4" futures-timer = "3.0.1" libp2p = { version = "0.18.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-alpha.8"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} prost = "0.6.1" rand = "0.7.2" -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sc-network = { version = "0.8.0-dev", path = "../network" } serde_json = "1.0.41" -sp-authority-discovery = { version = "2.0.0-alpha.8", path = "../../primitives/authority-discovery" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-authority-discovery = { version = "2.0.0-dev", path = "../../primitives/authority-discovery" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } [dev-dependencies] env_logger = "0.7.0" quickcheck = "0.9.0" -sc-peerset = { version = "2.0.0-alpha.8", path = "../peerset" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client"} +sc-peerset = { version = "2.0.0-dev", path = "../peerset" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client"} diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index 5a5aaacd5f..ad15cbedd3 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-basic-authorship" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,20 +15,20 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4.8" futures = "0.3.4" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../primitives/inherents" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-dev", path = "../../primitives/inherents" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } futures-timer = "3.0.1" [dev-dependencies] -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../client/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../../client/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } parking_lot = "0.10.0" diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index 07eb6fc82a..df2aca9cf5 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-block-builder" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../../primitives/block-builder" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-block-builder = { version = "2.0.0-dev", path = "../../primitives/block-builder" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } [dev-dependencies] substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } +sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } diff --git a/client/chain-spec/Cargo.toml b/client/chain-spec/Cargo.toml index 305de23b1d..fbbf05f55b 100644 --- a/client/chain-spec/Cargo.toml +++ b/client/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,12 +12,12 @@ description = "Substrate chain configurations." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-chain-spec-derive = { version = "2.0.0-alpha.8", path = "./derive" } +sc-chain-spec-derive = { version = "2.0.0-dev", path = "./derive" } impl-trait-for-tuples = "0.1.3" -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-chain-spec = { version = "2.0.0-alpha.8", path = "../../primitives/chain-spec" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-chain-spec = { version = "2.0.0-dev", path = "../../primitives/chain-spec" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } diff --git a/client/chain-spec/derive/Cargo.toml b/client/chain-spec/derive/Cargo.toml index beacd7ffda..643b3bab82 100644 --- a/client/chain-spec/derive/Cargo.toml +++ b/client/chain-spec/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec-derive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 8be0381ee8..1dc5f1a39f 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-cli" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" @@ -26,23 +26,23 @@ tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.4" fdlimit = "0.1.4" serde_json = "1.0.41" -sc-informant = { version = "0.8.0-alpha.8", path = "../informant" } -sp-panic-handler = { version = "2.0.0-alpha.8", path = "../../primitives/panic-handler" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../service" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } -substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-alpha.8"} -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +sc-informant = { version = "0.8.0-dev", path = "../informant" } +sp-panic-handler = { version = "2.0.0-dev", path = "../../primitives/panic-handler" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../service" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-dev"} +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } names = "0.11.0" structopt = "0.3.8" -sc-tracing = { version = "2.0.0-alpha.8", path = "../tracing" } +sc-tracing = { version = "2.0.0-dev", path = "../tracing" } chrono = "0.4.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index a4f5861260..c8a00f9185 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-aura" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" @@ -12,37 +12,37 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/aura" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-dev", path = "../../../primitives/consensus/aura" } +sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } derive_more = "0.99.2" futures = "0.3.4" futures-timer = "3.0.1" -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../../keystore" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sc-keystore = { version = "2.0.0-dev", path = "../../keystore" } log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } -sp-version = { version = "2.0.0-alpha.8", path = "../../../primitives/version" } -sc-consensus-slots = { version = "0.8.0-alpha.8", path = "../slots" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-alpha.8", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../../telemetry" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-version = { version = "2.0.0-dev", path = "../../../primitives/version" } +sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} [dev-dependencies] -sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../executor" } -sc-network = { version = "0.8.0-alpha.8", path = "../../network" } -sc-network-test = { version = "0.8.0-alpha.8", path = "../../network/test" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-dev", path = "../../executor" } +sc-network = { version = "0.8.0-dev", path = "../../network" } +sc-network-test = { version = "0.8.0-dev", path = "../../network/test" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 033f3da62b..1a0c7b2985 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" @@ -14,31 +14,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } num-bigint = "0.2.3" num-rational = "0.2.2" num-traits = "0.2.8" serde = { version = "1.0.104", features = ["derive"] } -sp-version = { version = "2.0.0-alpha.8", path = "../../../primitives/version" } -sp-io = { version = "2.0.0-alpha.8", path = "../../../primitives/io" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } -sp-timestamp = { version = "2.0.0-alpha.8", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../../telemetry" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../../keystore" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../epochs" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sp-consensus-vrf = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/vrf" } -sc-consensus-uncles = { version = "0.8.0-alpha.8", path = "../uncles" } -sc-consensus-slots = { version = "0.8.0-alpha.8", path = "../slots" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -fork-tree = { version = "2.0.0-alpha.8", path = "../../../utils/fork-tree" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} +sp-version = { version = "2.0.0-dev", path = "../../../primitives/version" } +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } +sc-keystore = { version = "2.0.0-dev", path = "../../keystore" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sc-consensus-epochs = { version = "0.8.0-dev", path = "../epochs" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-consensus-vrf = { version = "0.8.0-dev", path = "../../../primitives/consensus/vrf" } +sc-consensus-uncles = { version = "0.8.0-dev", path = "../uncles" } +sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" @@ -50,13 +50,13 @@ pdqselect = "0.1.0" derive_more = "0.99.2" [dev-dependencies] -sp-keyring = { version = "2.0.0-alpha.8", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../executor" } -sc-network = { version = "0.8.0-alpha.8", path = "../../network" } -sc-network-test = { version = "0.8.0-alpha.8", path = "../../network/test" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../block-builder" } +sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-dev", path = "../../executor" } +sc-network = { version = "0.8.0-dev", path = "../../network" } +sc-network-test = { version = "0.8.0-dev", path = "../../network/test" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/rpc/Cargo.toml b/client/consensus/babe/rpc/Cargo.toml index 1f365a9e2a..2a0762e1a8 100644 --- a/client/consensus/babe/rpc/Cargo.toml +++ b/client/consensus/babe/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe-rpc" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "RPC extensions for the BABE consensus algorithm" edition = "2018" @@ -12,24 +12,24 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-consensus-babe = { version = "0.8.0-alpha.8", path = "../" } +sc-consensus-babe = { version = "0.8.0-dev", path = "../" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../../primitives/consensus/babe" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../../../primitives/consensus/babe" } serde = { version = "1.0.104", features=["derive"] } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../../primitives/runtime" } -sc-consensus-epochs = { version = "0.8.0-alpha.8", path = "../../epochs" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../../../primitives/runtime" } +sc-consensus-epochs = { version = "0.8.0-dev", path = "../../epochs" } futures = { version = "0.3.4", features = ["compat"] } derive_more = "0.99.2" -sp-api = { version = "2.0.0-alpha.8", path = "../../../../primitives/api" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../../primitives/consensus/common" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../../primitives/core" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../../../keystore" } +sp-api = { version = "2.0.0-dev", path = "../../../../primitives/api" } +sp-consensus = { version = "0.8.0-dev", path = "../../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } +sc-keystore = { version = "2.0.0-dev", path = "../../../keystore" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../../test-utils/runtime/client" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../../primitives/application-crypto" } -sp-keyring = { version = "2.0.0-alpha.8", path = "../../../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../../../primitives/application-crypto" } +sp-keyring = { version = "2.0.0-dev", path = "../../../../primitives/keyring" } tempfile = "3.1.0" diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index 54fefb00fa..bf7fac9568 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,7 +12,7 @@ description = "Collection of common consensus specific imlementations for Substr targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } diff --git a/client/consensus/epochs/Cargo.toml b/client/consensus/epochs/Cargo.toml index a55806ee38..7c2edffc53 100644 --- a/client/consensus/epochs/Cargo.toml +++ b/client/consensus/epochs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-epochs" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Generic epochs-based utilities for consensus" edition = "2018" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -fork-tree = { version = "2.0.0-alpha.8", path = "../../../utils/fork-tree" } -sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-alpha.8"} -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sc-client-api = { path = "../../api" , version = "2.0.0-alpha.8"} +fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } +sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-dev"} +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sc-client-api = { path = "../../api" , version = "2.0.0-dev"} diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 34b7d13cb7..3d42412f2f 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-manual-seal" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Manual sealing engine for Substrate" edition = "2018" @@ -22,20 +22,20 @@ parking_lot = "0.10.0" serde = { version = "1.0", features=["derive"] } assert_matches = "1.3.0" -sc-client-api = { path = "../../../client/api", version = "2.0.0-alpha.8" } -sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-alpha.8" } -sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-alpha.8" } -sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-alpha.8" } -sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-alpha.8" } -sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-alpha.8" } -sp-core = { path = "../../../primitives/core", version = "2.0.0-alpha.8" } -sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-alpha.8" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8" } +sc-client-api = { path = "../../../client/api", version = "2.0.0-dev" } +sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-dev" } +sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-dev" } +sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-dev" } +sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-dev" } +sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-dev" } +sp-core = { path = "../../../primitives/core", version = "2.0.0-dev" } +sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-dev" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev" } [dev-dependencies] -sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-alpha.8" } -substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-alpha.8" } -substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-alpha.8" } +sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-dev" } +substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-dev" } +substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-dev" } tokio = { version = "0.2", features = ["rt-core", "macros"] } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index a41c1bea79..3d47a983ea 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-pow" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "PoW consensus algorithm for substrate" edition = "2018" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../../../primitives/block-builder" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } -sp-consensus-pow = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/pow" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sp-consensus-pow = { version = "0.8.0-dev", path = "../../../primitives/consensus/pow" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } log = "0.4.8" futures = { version = "0.3.1", features = ["compat"] } -sp-timestamp = { version = "2.0.0-alpha.8", path = "../../../primitives/timestamp" } +sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } derive_more = "0.99.2" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index fdaa4871a1..f778cbf2f0 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-slots" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../../primitives/application-crypto" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../../telemetry" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" log = "0.4.8" [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } diff --git a/client/consensus/uncles/Cargo.toml b/client/consensus/uncles/Cargo.toml index e052e8b023..b9039d8189 100644 --- a/client/consensus/uncles/Cargo.toml +++ b/client/consensus/uncles/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-uncles" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Generic uncle inclusion utilities for consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-authorship = { version = "2.0.0-alpha.8", path = "../../../primitives/authorship" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-authorship = { version = "2.0.0-dev", path = "../../../primitives/authorship" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } log = "0.4.8" diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index 9aaccf1da0..c9006ee2f6 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-db" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -23,22 +23,22 @@ parity-util-mem = { version = "0.6.1", default-features = false, features = ["st codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } blake2-rfc = "0.2.18" -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } -sc-state-db = { version = "0.8.0-alpha.8", path = "../state-db" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-database = { version = "2.0.0-alpha.8", path = "../../primitives/database" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-executor = { version = "0.8.0-dev", path = "../executor" } +sc-state-db = { version = "0.8.0-dev", path = "../state-db" } +sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } parity-db = { version = "0.1.2", optional = true } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-alpha.8", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } [dev-dependencies] -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } env_logger = "0.7.0" quickcheck = "0.9" kvdb-rocksdb = "0.8" diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index cea11c9a0c..ac863fbd8c 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,22 +15,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } -sp-serializer = { version = "2.0.0-alpha.8", path = "../../primitives/serializer" } -sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } -sp-panic-handler = { version = "2.0.0-alpha.8", path = "../../primitives/panic-handler" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } +sp-serializer = { version = "2.0.0-dev", path = "../../primitives/serializer" } +sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-panic-handler = { version = "2.0.0-dev", path = "../../primitives/panic-handler" } wasmi = "0.6.2" parity-wasm = "0.41.0" lazy_static = "1.4.0" -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../primitives/runtime-interface" } -sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } -sc-executor-common = { version = "0.8.0-alpha.8", path = "common" } -sc-executor-wasmi = { version = "0.8.0-alpha.8", path = "wasmi" } -sc-executor-wasmtime = { version = "0.8.0-alpha.8", path = "wasmtime", optional = true } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-wasm-interface = { version = "2.0.0-dev", path = "../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface" } +sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } +sc-executor-common = { version = "0.8.0-dev", path = "common" } +sc-executor-wasmi = { version = "0.8.0-dev", path = "wasmi" } +sc-executor-wasmtime = { version = "0.8.0-dev", path = "wasmtime", optional = true } parking_lot = "0.10.0" log = "0.4.8" libsecp256k1 = "0.3.4" @@ -39,11 +39,11 @@ libsecp256k1 = "0.3.4" assert_matches = "1.3.0" wabt = "0.9.2" hex-literal = "0.2.1" -sc-runtime-test = { version = "2.0.0-alpha.8", path = "runtime-test" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sc-runtime-test = { version = "2.0.0-dev", path = "runtime-test" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } test-case = "0.3.3" -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } [features] default = [ "std" ] diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index 890010caf1..ed91c353b9 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-common" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,11 +18,11 @@ derive_more = "0.99.2" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } wasmi = "0.6.2" -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-alpha.8", path = "../../../primitives/allocator" } -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime-interface" } -sp-serializer = { version = "2.0.0-alpha.8", path = "../../../primitives/serializer" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } +sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } +sp-serializer = { version = "2.0.0-dev", path = "../../../primitives/serializer" } [features] default = [] diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index 54ba45921f..c675e72e0f 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-runtime-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,12 +13,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/io" } -sp-sandbox = { version = "0.8.0-alpha.8", default-features = false, path = "../../../primitives/sandbox" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -sp-allocator = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/allocator" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/io" } +sp-sandbox = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/sandbox" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-allocator = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/allocator" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 4638727742..7ccb167325 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmi" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4.8" wasmi = "0.6.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-alpha.8", path = "../common" } -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-alpha.8", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-dev", path = "../common" } +sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 0a803d772a..8a424dfc2e 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmtime" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,11 +16,11 @@ log = "0.4.8" scoped-tls = "1.0" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-alpha.8", path = "../common" } -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-alpha.8", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-dev", path = "../common" } +sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.2" } wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.2" } wasmtime-environ = "0.16" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 179a938270..f0f89b6278 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -fork-tree = { version = "2.0.0-alpha.8", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-dev", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" @@ -23,37 +23,37 @@ parking_lot = "0.10.0" rand = "0.7.2" assert_matches = "1.3.0" parity-scale-codec = { version = "1.3.0", features = ["derive"] } -sp-arithmetic = { version = "2.0.0-alpha.8", path = "../../primitives/arithmetic" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../client/consensus/common" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } +sp-arithmetic = { version = "2.0.0-dev", path = "../../primitives/arithmetic" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-dev", path = "../../client/consensus/common" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sc-keystore = { version = "2.0.0-dev", path = "../keystore" } serde_json = "1.0.41" -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-inherents = { version = "2.0.0-alpha.8", path = "../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sc-network-gossip = { version = "0.8.0-alpha.8", path = "../network-gossip" } -sp-finality-tracker = { version = "2.0.0-alpha.8", path = "../../primitives/finality-tracker" } -sp-finality-grandpa = { version = "2.0.0-alpha.8", path = "../../primitives/finality-grandpa" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-alpha.8"} -sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-inherents = { version = "2.0.0-dev", path = "../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sc-network-gossip = { version = "0.8.0-dev", path = "../network-gossip" } +sp-finality-tracker = { version = "2.0.0-dev", path = "../../primitives/finality-tracker" } +sp-finality-grandpa = { version = "2.0.0-dev", path = "../../primitives/finality-grandpa" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} +sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } pin-project = "0.4.6" [dev-dependencies] finality-grandpa = { version = "0.12.3", features = ["derive-codec", "test-helpers"] } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sc-network-test = { version = "0.8.0-alpha.8", path = "../network/test" } -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/babe" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sc-network-test = { version = "0.8.0-dev", path = "../network/test" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../primitives/consensus/babe" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } env_logger = "0.7.0" tokio = { version = "0.2", features = ["rt-core"] } tempfile = "3.1.0" -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } diff --git a/client/finality-grandpa/rpc/Cargo.toml b/client/finality-grandpa/rpc/Cargo.toml index 75d7497235..0eecec19f7 100644 --- a/client/finality-grandpa/rpc/Cargo.toml +++ b/client/finality-grandpa/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa-rpc" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "RPC extensions for the GRANDPA finality gadget" repository = "https://github.com/paritytech/substrate/" @@ -8,7 +8,7 @@ edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] -sc-finality-grandpa = { version = "0.8.0-alpha.8", path = "../" } +sc-finality-grandpa = { version = "0.8.0-dev", path = "../" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.3" @@ -20,4 +20,4 @@ log = "0.4.8" derive_more = "0.99.2" [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } diff --git a/client/informant/Cargo.toml b/client/informant/Cargo.toml index 695f480915..5957cfc297 100644 --- a/client/informant/Cargo.toml +++ b/client/informant/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-informant" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate informant." edition = "2018" @@ -17,8 +17,8 @@ futures = "0.3.4" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } wasm-timer = "0.2" -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../service" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../service" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index f81251bf6b..6de93f28be 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-keystore" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } hex = "0.4.0" rand = "0.7.2" serde_json = "1.0.41" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 78b80f1033..d46e3420ea 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Gossiping for the Substrate network protocol" name = "sc-network-gossip" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -19,12 +19,12 @@ futures-timer = "3.0.1" libp2p = { version = "0.18.1", default-features = false, features = ["websocket"] } log = "0.4.8" lru = "0.4.3" -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } wasm-timer = "0.2" [dev-dependencies] async-std = "1.5" quickcheck = "0.9.0" rand = "0.7.2" -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index e2bdea235d..537ab43672 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate network protocol" name = "sc-network" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -25,7 +25,7 @@ derive_more = "0.99.2" either = "1.5.3" erased-serde = "0.3.9" fnv = "1.0.6" -fork-tree = { version = "2.0.0-alpha.8", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-dev", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" futures_codec = "0.3.3" @@ -38,23 +38,23 @@ lru = "0.4.0" nohash-hasher = "0.2.0" parking_lot = "0.10.0" pin-project = "0.4.6" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-alpha.8", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } prost = "0.6.1" rand = "0.7.2" -sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sc-peerset = { version = "2.0.0-alpha.8", path = "../peerset" } +sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sc-peerset = { version = "2.0.0-dev", path = "../peerset" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } slog_derive = "0.2.0" smallvec = "0.6.10" -sp-arithmetic = { version = "2.0.0-alpha.8", path = "../../primitives/arithmetic" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +sp-arithmetic = { version = "2.0.0-dev", path = "../../primitives/arithmetic" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } thiserror = "1" unsigned-varint = { version = "0.3.1", features = ["futures", "futures-codec"] } void = "1.0.2" @@ -73,10 +73,10 @@ env_logger = "0.7.0" libp2p = { version = "0.18.1", default-features = false, features = ["secio"] } quickcheck = "0.9.0" rand = "0.7.2" -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } -sp-test-primitives = { version = "2.0.0-alpha.8", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } tempfile = "3.1.0" [features] diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 38e1ceb8ea..5abc9a1ea7 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Integration tests for Substrate network protocol" name = "sc-network-test" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-network = { version = "0.8.0-alpha.8", path = "../" } +sc-network = { version = "0.8.0-dev", path = "../" } log = "0.4.8" parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" rand = "0.7.2" libp2p = { version = "0.18.1", default-features = false, features = ["libp2p-websocket"] } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../block-builder" } -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/babe" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } env_logger = "0.7.0" -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } tempfile = "3.1.0" -sc-service = { version = "0.8.0-alpha.8", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../service" } diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index 29c36331df..5a13b44a80 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers" name = "sc-offchain" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bytes = "0.5" -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } fnv = "1.0.6" futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" threadpool = "1.7" num_cpus = "1.10" -sp-offchain = { version = "2.0.0-alpha.8", path = "../../primitives/offchain" } +sp-offchain = { version = "2.0.0-dev", path = "../../primitives/offchain" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } rand = "0.7.2" -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sc-keystore = { version = "2.0.0-dev", path = "../keystore" } [target.'cfg(not(target_os = "unknown"))'.dependencies] hyper = "0.13.2" @@ -38,10 +38,10 @@ hyper-rustls = "0.20" [dev-dependencies] env_logger = "0.7.0" fdlimit = "0.1.4" -sc-client-db = { version = "0.8.0-alpha.8", default-features = true, path = "../db/" } -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sc-client-db = { version = "0.8.0-dev", default-features = true, path = "../db/" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } tokio = "0.2" [features] diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index f23e89e0f5..b4c5005324 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -3,7 +3,7 @@ description = "Connectivity manager based on reputation" homepage = "http://parity.io" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" name = "sc-peerset" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" repository = "https://github.com/paritytech/substrate/" @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" libp2p = { version = "0.18.1", default-features = false } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils"} +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils"} log = "0.4.8" serde_json = "1.0.41" wasm-timer = "0.2" diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index 3f984a09ed..f591a6d853 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-api" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -21,11 +21,11 @@ jsonrpc-derive = "14.0.3" jsonrpc-pubsub = "14.0.3" log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } -sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-alpha.8"} -sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-alpha.8"} +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-dev"} +sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-dev"} serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -sp-rpc = { version = "2.0.0-alpha.8", path = "../../primitives/rpc" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +sp-rpc = { version = "2.0.0-dev", path = "../../primitives/rpc" } diff --git a/client/rpc-servers/Cargo.toml b/client/rpc-servers/Cargo.toml index 1f9172b908..a57baf1db7 100644 --- a/client/rpc-servers/Cargo.toml +++ b/client/rpc-servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-server" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -17,7 +17,7 @@ pubsub = { package = "jsonrpc-pubsub", version = "14.0.3" } log = "0.4.8" serde = "1.0.101" serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } [target.'cfg(not(target_os = "unknown"))'.dependencies] http = { package = "jsonrpc-http-server", version = "14.0.3" } diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index a97a46fa29..94d4b38600 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,38 +12,38 @@ description = "Substrate Client RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-rpc-api = { version = "0.8.0-alpha.8", path = "../rpc-api" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } +sc-rpc-api = { version = "0.8.0-dev", path = "../rpc-api" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.1", features = ["compat"] } jsonrpc-pubsub = "14.0.3" log = "0.4.8" -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } rpc = { package = "jsonrpc-core", version = "14.0.3" } -sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } +sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } serde_json = "1.0.41" -sp-session = { version = "2.0.0-alpha.8", path = "../../primitives/session" } -sp-offchain = { version = "2.0.0-alpha.8", path = "../../primitives/offchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } -sp-rpc = { version = "2.0.0-alpha.8", path = "../../primitives/rpc" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sp-chain-spec = { version = "2.0.0-alpha.8", path = "../../primitives/chain-spec" } -sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../client/block-builder" } -sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } +sp-session = { version = "2.0.0-dev", path = "../../primitives/session" } +sp-offchain = { version = "2.0.0-dev", path = "../../primitives/offchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-rpc = { version = "2.0.0-dev", path = "../../primitives/rpc" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-chain-spec = { version = "2.0.0-dev", path = "../../primitives/chain-spec" } +sc-executor = { version = "0.8.0-dev", path = "../executor" } +sc-block-builder = { version = "0.8.0-dev", path = "../../client/block-builder" } +sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } hash-db = { version = "0.15.2", default-features = false } parking_lot = "0.10.0" [dev-dependencies] assert_matches = "1.3.0" futures01 = { package = "futures", version = "0.1.29" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } tokio = "0.1.22" -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../transaction-pool" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } lazy_static = "1.4.0" diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 04a6f488b1..5a026e5890 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -39,38 +39,38 @@ hash-db = "0.15.2" serde = "1.0.101" serde_json = "1.0.41" sysinfo = "0.13.3" -sc-keystore = { version = "2.0.0-alpha.8", path = "../keystore" } -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-session = { version = "2.0.0-alpha.8", path = "../../primitives/session" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../primitives/application-crypto" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sc-network = { version = "0.8.0-alpha.8", path = "../network" } -sc-chain-spec = { version = "2.0.0-alpha.8", path = "../chain-spec" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sc-client-db = { version = "0.8.0-alpha.8", default-features = false, path = "../db" } +sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-session = { version = "2.0.0-dev", path = "../../primitives/session" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sc-network = { version = "0.8.0-dev", path = "../network" } +sc-chain-spec = { version = "2.0.0-dev", path = "../chain-spec" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../db" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor = { version = "0.8.0-alpha.8", path = "../executor" } -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../transaction-pool" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -sc-rpc-server = { version = "2.0.0-alpha.8", path = "../rpc-servers" } -sc-rpc = { version = "2.0.0-alpha.8", path = "../rpc" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../block-builder" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../../primitives/block-builder" } +sc-executor = { version = "0.8.0-dev", path = "../executor" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +sc-rpc-server = { version = "2.0.0-dev", path = "../rpc-servers" } +sc-rpc = { version = "2.0.0-dev", path = "../rpc" } +sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } +sp-block-builder = { version = "2.0.0-dev", path = "../../primitives/block-builder" } -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } -sc-offchain = { version = "2.0.0-alpha.8", path = "../offchain" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sc-offchain = { version = "2.0.0-dev", path = "../offchain" } parity-multiaddr = { package = "parity-multiaddr", version = "0.7.3" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-alpha.8"} -sc-tracing = { version = "2.0.0-alpha.8", path = "../tracing" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-dev"} +sc-tracing = { version = "2.0.0-dev", path = "../tracing" } tracing = "0.1.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } @@ -83,7 +83,7 @@ procfs = '0.7.8' [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/babe" } -grandpa = { version = "0.8.0-alpha.8", package = "sc-finality-grandpa", path = "../finality-grandpa" } -grandpa-primitives = { version = "2.0.0-alpha.8", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-dev", path = "../../primitives/consensus/babe" } +grandpa = { version = "0.8.0-dev", package = "sc-finality-grandpa", path = "../finality-grandpa" } +grandpa-primitives = { version = "2.0.0-dev", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index 76420f9139..c44f436513 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,24 +20,24 @@ log = "0.4.8" env_logger = "0.7.0" fdlimit = "0.1.4" parking_lot = "0.10.0" -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } -sp-externalities = { version = "0.8.0-alpha.8", path = "../../../primitives/externalities" } -sp-trie = { version = "2.0.0-alpha.8", path = "../../../primitives/trie" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../../primitives/storage" } -sc-client-db = { version = "0.8.0-alpha.8", default-features = false, path = "../../db" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } +sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } +sp-storage = { version = "2.0.0-dev", path = "../../../primitives/storage" } +sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../../db" } futures = { version = "0.3.1", features = ["compat"] } -sc-service = { version = "0.8.0-alpha.8", default-features = false, features = ["test-helpers"], path = "../../service" } -sc-network = { version = "0.8.0-alpha.8", path = "../../network" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../api" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../block-builder" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../executor" } -sp-panic-handler = { version = "2.0.0-alpha.8", path = "../../../primitives/panic-handler" } +sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-network = { version = "0.8.0-dev", path = "../../network" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } +sc-executor = { version = "0.8.0-dev", path = "../../executor" } +sp-panic-handler = { version = "2.0.0-dev", path = "../../../primitives/panic-handler" } parity-scale-codec = "1.3.0" diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index 17b9340afd..f4f084bc89 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-state-db" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = "0.10.0" log = "0.4.8" -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parity-util-mem-derive = "0.1.0" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 4a3f302fb6..e2c08babf3 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-telemetry" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 4e1924180b..52fa8d6600 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-tracing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -20,7 +20,7 @@ serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } tracing-core = "0.1.7" -sc-telemetry = { version = "2.0.0-alpha.8", path = "../telemetry" } +sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } [dev-dependencies] tracing = "0.1.10" diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index a7b50c847c..8b51bc7418 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,21 +20,21 @@ intervalier = "0.4.0" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parking_lot = "0.10.0" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-alpha.8"} -sc-client-api = { version = "2.0.0-alpha.8", path = "../api" } -sc-transaction-graph = { version = "2.0.0-alpha.8", path = "./graph" } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-alpha.8", path = "../../primitives/tracing" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../primitives/utils" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} +sc-client-api = { version = "2.0.0-dev", path = "../api" } +sc-transaction-graph = { version = "2.0.0-dev", path = "./graph" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-dev", path = "../../primitives/tracing" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } wasm-timer = "0.2" [dev-dependencies] assert_matches = "1.3.0" hex = "0.4" -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } -substrate-test-runtime-transaction-pool = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +substrate-test-runtime-transaction-pool = { version = "2.0.0-dev", path = "../../test-utils/runtime/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index eaa70743e2..4f9131aa96 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-graph" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,18 +18,18 @@ log = "0.4.8" parking_lot = "0.10.0" serde = { version = "1.0.101", features = ["derive"] } wasm-timer = "0.2" -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../../primitives/utils" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-utils = { version = "2.0.0-dev", path = "../../../primitives/utils" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } linked-hash-map = "0.5.2" [dev-dependencies] assert_matches = "1.3.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } criterion = "0.3" [[bench]] diff --git a/frame/assets/Cargo.toml b/frame/assets/Cargo.toml index 6dc6e3e513..dc2a838d1c 100644 --- a/frame/assets/Cargo.toml +++ b/frame/assets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-assets" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } # Needed for various traits. In our case, `OnFinalize`. -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } # Needed for type-safe access to storage DB. -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } # `system` module provides us with all sorts of useful stuff and macros depend on it being around. -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index f052f8c7e4..cd7f17ba13 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-aura" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME AURA consensus pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -sp-consensus-aura = { path = "../../primitives/consensus/aura", default-features = false, version = "0.8.0-alpha.8"} -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/timestamp" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } +pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +sp-consensus-aura = { path = "../../primitives/consensus/aura", default-features = false, version = "0.8.0-dev"} +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } [dev-dependencies] diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index a9f352a8bc..134dff4017 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authority-discovery" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME pallet for authority discovery" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-authority-discovery = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/authority-discovery" } -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authority-discovery" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -pallet-session = { version = "2.0.0-alpha.8", features = ["historical" ], path = "../session", default-features = false } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +pallet-session = { version = "2.0.0-dev", features = ["historical" ], path = "../session", default-features = false } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } [features] default = ["std"] diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index 46ce41e148..d5769783a9 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authorship" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" description = "Block and Uncle Author tracking for the FRAME" authors = ["Parity Technologies "] edition = "2018" @@ -12,15 +12,15 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/authorship" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-authorship = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authorship" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} impl-trait-for-tuples = "0.1.3" [features] diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 3340f7a71e..685e508a3d 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-babe" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,22 +14,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/timestamp" } -pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } -sp-consensus-babe = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/babe" } -sp-consensus-vrf = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/vrf" } -sp-io = { path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } +pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } +sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } +sp-consensus-vrf = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/vrf" } +sp-io = { path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index 29802a68d2..3916d5605f 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-balances" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../transaction-payment" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } [features] default = ["std"] diff --git a/frame/benchmark/Cargo.toml b/frame/benchmark/Cargo.toml index 1c56424151..7fab3642f2 100644 --- a/frame/benchmark/Cargo.toml +++ b/frame/benchmark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-benchmark" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std"] diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index b963b73483..fcc8e0bf92 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,13 +15,13 @@ targets = ["x86_64-unknown-linux-gnu"] linregress = "0.1" paste = "0.1" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api = { version = "2.0.0-alpha.8", path = "../../primitives/api", default-features = false } -sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../../primitives/runtime-interface", default-features = false } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime", default-features = false } -sp-std = { version = "2.0.0-alpha.8", path = "../../primitives/std", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-alpha.8"} -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-api = { version = "2.0.0-dev", path = "../../primitives/api", default-features = false } +sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface", default-features = false } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime", default-features = false } +sp-std = { version = "2.0.0-dev", path = "../../primitives/std", default-features = false } +sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-dev"} +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [features] default = [ "std" ] diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index 8372880400..f2a7f46b06 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-collective" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index 0cbd731147..3350e815b2 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,23 +17,23 @@ pwasm-utils = { version = "0.12.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } parity-wasm = { version = "0.41.0", default-features = false } wasmi-validation = { version = "0.3.0", default-features = false } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-sandbox = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/sandbox" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-contracts-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "common" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", default-features = false, path = "../transaction-payment" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-sandbox = { version = "0.8.0-dev", default-features = false, path = "../../primitives/sandbox" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "common" } +pallet-transaction-payment = { version = "2.0.0-dev", default-features = false, path = "../transaction-payment" } [dev-dependencies] wabt = "0.9.2" assert_matches = "1.3.0" hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../timestamp" } -pallet-randomness-collective-flip = { version = "2.0.0-alpha.8", path = "../randomness-collective-flip" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } +pallet-randomness-collective-flip = { version = "2.0.0-dev", path = "../randomness-collective-flip" } [features] default = ["std"] diff --git a/frame/contracts/common/Cargo.toml b/frame/contracts/common/Cargo.toml index 15f0b8a0e7..d834be7437 100644 --- a/frame/contracts/common/Cargo.toml +++ b/frame/contracts/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-primitives" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # This crate should not rely on any of the frame primitives. codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } [features] default = ["std"] diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index f8692de80a..f3d32e7696 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-alpha.8", path = "../../../primitives/rpc" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-dev", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -pallet-contracts-primitives = { version = "2.0.0-alpha.8", path = "../common" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-alpha.8", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +pallet-contracts-primitives = { version = "2.0.0-dev", path = "../common" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-dev", path = "./runtime-api" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index e9d9e6fdfa..fdcfb5149a 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Runtime API definition required by Contracts RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/runtime" } -pallet-contracts-primitives = { version = "2.0.0-alpha.8", default-features = false, path = "../../common" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/runtime" } +pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "../../common" } [features] default = ["std"] diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index e506561411..5c339d2bc5 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-democracy" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -pallet-scheduler = { version = "2.0.0-alpha.8", path = "../scheduler" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } -substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-scheduler = { version = "2.0.0-dev", path = "../scheduler" } +sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } hex-literal = "0.2.1" [features] diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index fc7c6c7993..f9a3ec0b21 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections-phragmen" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-phragmen = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/phragmen" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } [features] default = ["std"] diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index 0eb99ad94e..3109a13392 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index 124ee92ca8..c7aea6eb9b 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-evm" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } -pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } +pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } primitive-types = { version = "0.7.0", default-features = false, features = ["rlp"] } rlp = { version = "0.4", default-features = false } evm = { version = "0.16", default-features = false } diff --git a/frame/example-offchain-worker/Cargo.toml b/frame/example-offchain-worker/Cargo.toml index 5953240a4b..30381adb49 100644 --- a/frame/example-offchain-worker/Cargo.toml +++ b/frame/example-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example-offchain-worker" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -13,13 +13,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } lite-json = { version = "0.1", default-features = false } [features] diff --git a/frame/example/Cargo.toml b/frame/example/Cargo.toml index 16b05180bb..d12b1e7c83 100644 --- a/frame/example/Cargo.toml +++ b/frame/example/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index cb0efafac1..84918f7361 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-executive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,22 +13,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/tracing" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../../primitives/tracing" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } [dev-dependencies] hex-literal = "0.2.1" -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-io ={ path = "../../primitives/io", version = "2.0.0-alpha.8"} -pallet-indices = { version = "2.0.0-alpha.8", path = "../indices" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -pallet-transaction-payment = { version = "2.0.0-alpha.8", path = "../transaction-payment" } -sp-version = { version = "2.0.0-alpha.8", path = "../../primitives/version" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ path = "../../primitives/io", version = "2.0.0-dev"} +pallet-indices = { version = "2.0.0-dev", path = "../indices" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } +sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } [features] default = ["std"] diff --git a/frame/finality-tracker/Cargo.toml b/frame/finality-tracker/Cargo.toml index b0bf31304c..9c2019bfb5 100644 --- a/frame/finality-tracker/Cargo.toml +++ b/frame/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-finality-tracker" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,17 +16,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/finality-tracker" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-tracker" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/generic-asset/Cargo.toml b/frame/generic-asset/Cargo.toml index 97c37fae37..9b32d718ac 100644 --- a/frame/generic-asset/Cargo.toml +++ b/frame/generic-asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-generic-asset" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Centrality Developers "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index 3ee12a4aab..7a9a00a282 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-grandpa" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,27 +14,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-finality-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/finality-grandpa" } -sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/session" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } -pallet-finality-tracker = { version = "2.0.0-alpha.8", default-features = false, path = "../finality-tracker" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-finality-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-grandpa" } +sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } +pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../finality-tracker" } [dev-dependencies] grandpa = { package = "finality-grandpa", version = "0.12.3", features = ["derive-codec"] } -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -pallet-offences = { version = "2.0.0-alpha.8", path = "../offences" } -pallet-staking = { version = "2.0.0-alpha.8", path = "../staking" } -pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../timestamp" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-offences = { version = "2.0.0-dev", path = "../offences" } +pallet-staking = { version = "2.0.0-dev", path = "../staking" } +pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } [features] default = ["std"] diff --git a/frame/identity/Cargo.toml b/frame/identity/Cargo.toml index 9d36a235e0..bfe2a7d492 100644 --- a/frame/identity/Cargo.toml +++ b/frame/identity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-identity" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/im-online/Cargo.toml b/frame/im-online/Cargo.toml index 7c93b25e35..964bd2f69a 100644 --- a/frame/im-online/Cargo.toml +++ b/frame/im-online/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-im-online" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME's I'm online pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } -pallet-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../session" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std", "pallet-session/historical"] diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index 7a747ed294..db0f4cbf55 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-indices" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-keyring = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/keyring" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../primitives/keyring" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/membership/Cargo.toml b/frame/membership/Cargo.toml index 538c63acbb..befca54ad1 100644 --- a/frame/membership/Cargo.toml +++ b/frame/membership/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-membership" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index bbf2839341..1241c3b4ab 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-metadata" -version = "11.0.0-alpha.8" +version = "11.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/nicks/Cargo.toml b/frame/nicks/Cargo.toml index 24fd06e454..140a48523b 100644 --- a/frame/nicks/Cargo.toml +++ b/frame/nicks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-nicks" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/offences/Cargo.toml b/frame/offences/Cargo.toml index 4b5fbb9dbe..ebb31d680d 100644 --- a/frame/offences/Cargo.toml +++ b/frame/offences/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,18 +12,18 @@ description = "FRAME offences pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } +pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/offences/benchmarking/Cargo.toml b/frame/offences/benchmarking/Cargo.toml index f18865a45a..ff77497db0 100644 --- a/frame/offences/benchmarking/Cargo.toml +++ b/frame/offences/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,28 +13,28 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../system" } -pallet-babe = { version = "2.0.0-alpha.8", default-features = false, path = "../../babe" } -pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../../balances" } -pallet-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../grandpa" } -pallet-im-online = { version = "2.0.0-alpha.8", default-features = false, path = "../../im-online" } -pallet-offences = { version = "2.0.0-alpha.8", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } -pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../session" } -pallet-staking = { version = "2.0.0-alpha.8", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -sp-io = { path = "../../../primitives/io", default-features = false, version = "2.0.0-alpha.8"} -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/staking" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } +pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../babe" } +pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../../balances" } +pallet-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../grandpa" } +pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../im-online" } +pallet-offences = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } +pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } +pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +sp-io = { path = "../../../primitives/io", default-features = false, version = "2.0.0-dev"} +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } [dev-dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } serde = { version = "1.0.101" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-alpha.8"} +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} [features] default = ["std"] diff --git a/frame/randomness-collective-flip/Cargo.toml b/frame/randomness-collective-flip/Cargo.toml index efd41d96b0..2c6e733cae 100644 --- a/frame/randomness-collective-flip/Cargo.toml +++ b/frame/randomness-collective-flip/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-randomness-collective-flip" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] safe-mix = { version = "1.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml index 5d4ea80fca..b0a5982714 100644 --- a/frame/recovery/Cargo.toml +++ b/frame/recovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-recovery" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,15 +15,15 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/scheduler/Cargo.toml b/frame/scheduler/Cargo.toml index 6fdf61cf93..6cc9161eea 100644 --- a/frame/scheduler/Cargo.toml +++ b/frame/scheduler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scheduler" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -11,16 +11,16 @@ description = "FRAME example pallet" [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.2.0", default-features = false } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/scored-pool/Cargo.toml b/frame/scored-pool/Cargo.toml index e24505355d..83d1402957 100644 --- a/frame/scored-pool/Cargo.toml +++ b/frame/scored-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scored-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index 61fa57521e..b03eea494a 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/session" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../timestamp" } -sp-trie = { optional = true, path = "../../primitives/trie", default-features = false, version = "2.0.0-alpha.8"} -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } +sp-trie = { optional = true, path = "../../primitives/trie", default-features = false, version = "2.0.0-dev"} +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } lazy_static = "1.4.0" [features] diff --git a/frame/session/benchmarking/Cargo.toml b/frame/session/benchmarking/Cargo.toml index e06377a0b4..d263e1af9a 100644 --- a/frame/session/benchmarking/Cargo.toml +++ b/frame/session/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ description = "FRAME sessions pallet benchmarking" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../system" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../support" } -pallet-staking = { version = "2.0.0-alpha.8", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -pallet-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../session" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } +pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } [dev-dependencies] serde = { version = "1.0.101" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../../staking/reward-curve" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-alpha.8"} -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../timestamp" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../../balances" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } +sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} +pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } +pallet-balances = { version = "2.0.0-dev", path = "../../balances" } [features] default = ["std"] diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index 00f5aa651b..24380aff55 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-society" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } rand_chacha = { version = "0.2", default-features = false } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 38fb18b56a..022baa0f13 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,35 +14,35 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-phragmen = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/phragmen" } -sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io", default-features = false } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-alpha.8", features = ["historical"], path = "../session", default-features = false } -pallet-authorship = { version = "2.0.0-alpha.8", default-features = false, path = "../authorship" } -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io", default-features = false } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-dev", features = ["historical"], path = "../session", default-features = false } +pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } static_assertions = "1.1.0" # Optional imports for tesing-utils feature -pallet-indices = { version = "2.0.0-alpha.8", optional = true, path = "../indices", default-features = false } -sp-core = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/core", default-features = false } +pallet-indices = { version = "2.0.0-dev", optional = true, path = "../indices", default-features = false } +sp-core = { version = "2.0.0-dev", optional = true, path = "../../primitives/core", default-features = false } rand = { version = "0.7.3", optional = true, default-features = false } # Optional imports for benchmarking -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } rand_chacha = { version = "0.2", default-features = false, optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../timestamp" } -pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../staking/reward-curve" } -substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } -frame-benchmarking = { version = "2.0.0-alpha.8", path = "../benchmarking" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../staking/reward-curve" } +substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +frame-benchmarking = { version = "2.0.0-dev", path = "../benchmarking" } rand_chacha = { version = "0.2" } parking_lot = "0.10.2" env_logger = "0.7.1" diff --git a/frame/staking/fuzzer/Cargo.toml b/frame/staking/fuzzer/Cargo.toml index 9fa74d695d..c717dd8598 100644 --- a/frame/staking/fuzzer/Cargo.toml +++ b/frame/staking/fuzzer/Cargo.toml @@ -15,19 +15,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] honggfuzz = "0.5" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -pallet-staking = { version = "2.0.0-alpha.8", path = "..", features = ["testing-utils"] } -pallet-staking-reward-curve = { version = "2.0.0-alpha.8", path = "../reward-curve" } -pallet-session = { version = "2.0.0-alpha.8", path = "../../session" } -pallet-indices = { version = "2.0.0-alpha.8", path = "../../indices" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../../balances" } -pallet-timestamp = { version = "2.0.0-alpha.8", path = "../../timestamp" } -frame-system = { version = "2.0.0-alpha.8", path = "../../system" } -frame-support = { version = "2.0.0-alpha.8", path = "../../support" } -sp-std = { version = "2.0.0-alpha.8", path = "../../../primitives/std" } -sp-io ={ version = "2.0.0-alpha.8", path = "../../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-phragmen = { version = "2.0.0-alpha.8", path = "../../../primitives/phragmen" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-dev", path = "..", features = ["testing-utils"] } +pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../reward-curve" } +pallet-session = { version = "2.0.0-dev", path = "../../session" } +pallet-indices = { version = "2.0.0-dev", path = "../../indices" } +pallet-balances = { version = "2.0.0-dev", path = "../../balances" } +pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } +frame-system = { version = "2.0.0-dev", path = "../../system" } +frame-support = { version = "2.0.0-dev", path = "../../support" } +sp-std = { version = "2.0.0-dev", path = "../../../primitives/std" } +sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-phragmen = { version = "2.0.0-dev", path = "../../../primitives/phragmen" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } [[bin]] name = "submit_solution" diff --git a/frame/staking/reward-curve/Cargo.toml b/frame/staking/reward-curve/Cargo.toml index 52ba05e409..b5ec29060a 100644 --- a/frame/staking/reward-curve/Cargo.toml +++ b/frame/staking/reward-curve/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking-reward-curve" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -21,4 +21,4 @@ proc-macro2 = "1.0.6" proc-macro-crate = "0.1.4" [dev-dependencies] -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } diff --git a/frame/sudo/Cargo.toml b/frame/sudo/Cargo.toml index 1eb8de2cd0..bbceac1496 100644 --- a/frame/sudo/Cargo.toml +++ b/frame/sudo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-sudo" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index e2063bf69e..3213f0dfe4 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,24 +15,24 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4" serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-metadata = { version = "11.0.0-alpha.8", default-features = false, path = "../metadata" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/tracing" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-arithmetic = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/arithmetic" } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -frame-support-procedural = { version = "2.0.0-alpha.8", path = "./procedural" } +frame-metadata = { version = "11.0.0-dev", default-features = false, path = "../metadata" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../../primitives/tracing" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../../primitives/arithmetic" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +frame-support-procedural = { version = "2.0.0-dev", path = "./procedural" } paste = "0.1.6" once_cell = { version = "1", default-features = false, optional = true } -sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } bitmask = { version = "0.5.0", default-features = false } impl-trait-for-tuples = "0.1.3" [dev-dependencies] pretty_assertions = "0.6.1" -frame-system = { version = "2.0.0-alpha.8", path = "../system" } +frame-system = { version = "2.0.0-dev", path = "../system" } [features] default = ["std"] diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 6ef28cb75f..4d05685f9d 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -frame-support-procedural-tools = { version = "2.0.0-alpha.8", path = "./tools" } +frame-support-procedural-tools = { version = "2.0.0-dev", path = "./tools" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full"] } diff --git a/frame/support/procedural/tools/Cargo.toml b/frame/support/procedural/tools/Cargo.toml index d49a90895f..5e5e0eb4c4 100644 --- a/frame/support/procedural/tools/Cargo.toml +++ b/frame/support/procedural/tools/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Proc macro helpers for procedural macros" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-support-procedural-tools-derive = { version = "2.0.0-alpha.8", path = "./derive" } +frame-support-procedural-tools-derive = { version = "2.0.0-dev", path = "./derive" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full", "visit"] } diff --git a/frame/support/procedural/tools/derive/Cargo.toml b/frame/support/procedural/tools/derive/Cargo.toml index f5f9c83b55..7cc657e685 100644 --- a/frame/support/procedural/tools/derive/Cargo.toml +++ b/frame/support/procedural/tools/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools-derive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 67e00f3d8d..59014d893c 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ path = "../../../primitives/io", default-features = false , version = "2.0.0-alpha.8"} -sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../../primitives/state-machine" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../" } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/inherents" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } +sp-io ={ path = "../../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../../primitives/state-machine" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } trybuild = "1.0.17" pretty_assertions = "0.6.1" rustversion = "1.0.0" diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 9b4424d56a..099290f2c7 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-alpha.8"} -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/version" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-dev"} +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] criterion = "0.2.11" -sp-externalities = { version = "0.8.0-alpha.8", path = "../../primitives/externalities" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../test-utils/runtime/client" } +sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } [features] default = ["std"] diff --git a/frame/system/benchmarking/Cargo.toml b/frame/system/benchmarking/Cargo.toml index 25a9e8cf86..60ee030011 100644 --- a/frame/system/benchmarking/Cargo.toml +++ b/frame/system/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-benchmarking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../../benchmarking" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../system" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../support" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } [dev-dependencies] serde = { version = "1.0.101" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-alpha.8"} +sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} [features] default = ["std"] diff --git a/frame/system/rpc/runtime-api/Cargo.toml b/frame/system/rpc/runtime-api/Cargo.toml index 5d2811abcd..d0644931ae 100644 --- a/frame/system/rpc/runtime-api/Cargo.toml +++ b/frame/system/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-rpc-runtime-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Runtime API definition required by System RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [features] diff --git a/frame/timestamp/Cargo.toml b/frame/timestamp/Cargo.toml index e5ac4f1aa7..49abf80254 100644 --- a/frame/timestamp/Cargo.toml +++ b/frame/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-timestamp" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,19 +16,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io", optional = true } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/timestamp" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io", optional = true } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index 866d2ceda5..0f8b05c3dd 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "./rpc/runtime-api" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "./rpc/runtime-api" } [dev-dependencies] -sp-io = { version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } [features] default = ["std"] diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index f66e2a9f9d..3851c988e2 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,10 +16,10 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-alpha.8", path = "../../../primitives/rpc" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-dev", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-alpha.8", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", path = "./runtime-api" } diff --git a/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/frame/transaction-payment/rpc/runtime-api/Cargo.toml index 909e526ed3..f8e948ea10 100644 --- a/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../../support" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../support" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/treasury/Cargo.toml b/frame/treasury/Cargo.toml index 9d4a6fb5d2..9b031c4a0c 100644 --- a/frame/treasury/Cargo.toml +++ b/frame/treasury/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-treasury" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-alpha.8", default-features = false, path = "../balances" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io ={ version = "2.0.0-alpha.8", path = "../../primitives/io" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index 6fc23eb91e..fff5513682 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-utility" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] default = ["std"] diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml index 94924c07e2..96282db360 100644 --- a/frame/vesting/Cargo.toml +++ b/frame/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-vesting" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,17 +15,17 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-alpha.8", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-alpha.8", path = "../balances" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../primitives/storage" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } hex-literal = "0.2.1" [features] diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml index e3f64cc6c9..d56b4e34b2 100644 --- a/primitives/allocator/Cargo.toml +++ b/primitives/allocator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-allocator" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,9 +13,9 @@ documentation = "https://docs.rs/sp-allocator" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-alpha.8", path = "../std", default-features = false } -sp-core = { version = "2.0.0-alpha.8", path = "../core", default-features = false } -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-dev", path = "../std", default-features = false } +sp-core = { version = "2.0.0-dev", path = "../core", default-features = false } +sp-wasm-interface = { version = "2.0.0-dev", path = "../wasm-interface", default-features = false } log = { version = "0.4.8", optional = true } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 8c490673b2..f82bcac77e 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api-proc-macro = { version = "2.0.0-alpha.8", path = "proc-macro" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } -sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../version" } -sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../primitives/state-machine" } +sp-api-proc-macro = { version = "2.0.0-dev", path = "proc-macro" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-version = { version = "2.0.0-dev", default-features = false, path = "../version" } +sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } hash-db = { version = "0.15.2", optional = true } [dev-dependencies] -sp-test-primitives = { version = "2.0.0-alpha.8", path = "../test-primitives" } +sp-test-primitives = { version = "2.0.0-dev", path = "../test-primitives" } [features] default = [ "std" ] diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index 724a465008..46f804f32c 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-proc-macro" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index 8aa77b01ea..9e2d894a01 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-alpha.8", path = "../" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } -sp-version = { version = "2.0.0-alpha.8", path = "../../version" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../blockchain" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } +sp-api = { version = "2.0.0-dev", path = "../" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sp-version = { version = "2.0.0-dev", path = "../../version" } +sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-blockchain = { version = "2.0.0-dev", path = "../../blockchain" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } trybuild = "1.0.17" rustversion = "1.0.0" [dev-dependencies] criterion = "0.3.0" -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } -sp-core = { version = "2.0.0-alpha.8", path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sp-core = { version = "2.0.0-dev", path = "../../core" } [[bench]] name = "bench" diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index b48b61a99f..b350dee843 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" description = "Provides facilities for generating application specific crypto wrapper types." @@ -14,11 +14,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } [features] default = [ "std" ] diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index b50d035546..6e2c81f3a6 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" description = "Integration tests for application-crypto" @@ -13,8 +13,8 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../test-utils/runtime/client" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../api" } -sp-application-crypto = { version = "2.0.0-alpha.8", path = "../" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-api = { version = "2.0.0-dev", path = "../../api" } +sp-application-crypto = { version = "2.0.0-dev", path = "../" } diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index 0cab74a7b1..c22706e32e 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } integer-sqrt = "0.1.2" num-traits = { version = "0.2.8", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-debug-derive = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/debug-derive" } +sp-debug-derive = { version = "2.0.0-dev", default-features = false, path = "../../primitives/debug-derive" } primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index 9180414a3a..fdcf691762 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic-fuzzer" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-arithmetic = { version = "2.0.0-alpha.8", path = ".." } +sp-arithmetic = { version = "2.0.0-dev", path = ".." } honggfuzz = "0.5" primitive-types = "0.7.0" num-bigint = "0.2" diff --git a/primitives/authority-discovery/Cargo.toml b/primitives/authority-discovery/Cargo.toml index e39e795d1b..286a2e3141 100644 --- a/primitives/authority-discovery/Cargo.toml +++ b/primitives/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authority-discovery" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Authority discovery primitives" edition = "2018" @@ -12,11 +12,11 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", default-features = false, version = "1.3.0" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/authorship/Cargo.toml b/primitives/authorship/Cargo.toml index 98c3a549de..0888878ab8 100644 --- a/primitives/authorship/Cargo.toml +++ b/primitives/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authorship" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Authorship primitives" edition = "2018" @@ -12,9 +12,9 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/block-builder/Cargo.toml b/primitives/block-builder/Cargo.toml index 1875bc08a8..b9793621c9 100644 --- a/primitives/block-builder/Cargo.toml +++ b/primitives/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-block-builder" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "The block builder runtime api." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } [features] default = [ "std" ] diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index 3c6cd68170..9eb619ccb9 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-blockchain" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,7 +19,7 @@ lru = "0.4.0" parking_lot = "0.10.0" derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-alpha.8", path = "../consensus/common" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } -sp-block-builder = { version = "2.0.0-alpha.8", path = "../block-builder" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../state-machine" } +sp-consensus = { version = "0.8.0-dev", path = "../consensus/common" } +sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-block-builder = { version = "2.0.0-dev", path = "../block-builder" } +sp-state-machine = { version = "0.8.0-dev", path = "../state-machine" } diff --git a/primitives/chain-spec/Cargo.toml b/primitives/chain-spec/Cargo.toml index 2bb950042b..1d482c5970 100644 --- a/primitives/chain-spec/Cargo.toml +++ b/primitives/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-chain-spec" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/consensus/aura/Cargo.toml b/primitives/consensus/aura/Cargo.toml index f1f61f0957..b907b5689b 100644 --- a/primitives/consensus/aura/Cargo.toml +++ b/primitives/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-aura" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,13 +12,13 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../api" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../inherents" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../inherents" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/babe/Cargo.toml b/primitives/consensus/babe/Cargo.toml index f5b2bf0510..6a5da2788f 100644 --- a/primitives/consensus/babe/Cargo.toml +++ b/primitives/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-babe" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" @@ -12,16 +12,16 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } merlin = { version = "2.0", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../api" } -sp-consensus = { version = "0.8.0-alpha.8", optional = true, path = "../common" } -sp-consensus-vrf = { version = "0.8.0-alpha.8", path = "../vrf", default-features = false } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../inherents" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } -sp-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } +sp-consensus = { version = "0.8.0-dev", optional = true, path = "../common" } +sp-consensus-vrf = { version = "0.8.0-dev", path = "../vrf", default-features = false } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../inherents" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } +sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index ac17421f60..ec05e9fba1 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,22 +17,22 @@ targets = ["x86_64-unknown-linux-gnu"] derive_more = "0.99.2" libp2p = { version = "0.18.1", default-features = false } log = "0.4.8" -sp-core = { path= "../../core", version = "2.0.0-alpha.8"} -sp-inherents = { version = "2.0.0-alpha.8", path = "../../inherents" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +sp-core = { path= "../../core", version = "2.0.0-dev"} +sp-inherents = { version = "2.0.0-dev", path = "../../inherents" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } futures-timer = "3.0.1" -sp-std = { version = "2.0.0-alpha.8", path = "../../std" } -sp-version = { version = "2.0.0-alpha.8", path = "../../version" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } -sp-utils = { version = "2.0.0-alpha.8", path = "../../utils" } +sp-std = { version = "2.0.0-dev", path = "../../std" } +sp-version = { version = "2.0.0-dev", path = "../../version" } +sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-utils = { version = "2.0.0-dev", path = "../../utils" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" serde = { version = "1.0", features = ["derive"] } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-alpha.8"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} [dev-dependencies] -sp-test-primitives = { version = "2.0.0-alpha.8", path = "../../test-primitives" } +sp-test-primitives = { version = "2.0.0-dev", path = "../../test-primitives" } [features] default = [] diff --git a/primitives/consensus/pow/Cargo.toml b/primitives/consensus/pow/Cargo.toml index 6e3115258b..aedc50ab51 100644 --- a/primitives/consensus/pow/Cargo.toml +++ b/primitives/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-pow" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../api" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/consensus/vrf/Cargo.toml b/primitives/consensus/vrf/Cargo.toml index 76de25ffd6..fce027e7a0 100644 --- a/primitives/consensus/vrf/Cargo.toml +++ b/primitives/consensus/vrf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-vrf" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Primitives for VRF based consensus" edition = "2018" @@ -14,9 +14,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { version = "1.0.0", package = "parity-scale-codec", default-features = false } schnorrkel = { version = "0.9.1", features = ["preaudit_deprecated", "u64_backend"], default-features = false } -sp-std = { version = "2.0.0-alpha.8", path = "../../std", default-features = false } -sp-core = { version = "2.0.0-alpha.8", path = "../../core", default-features = false } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../runtime" } +sp-std = { version = "2.0.0-dev", path = "../../std", default-features = false } +sp-core = { version = "2.0.0-dev", path = "../../core", default-features = false } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } [features] default = ["std"] diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 23e4d55ca9..d028141d3d 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-core" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } log = { version = "0.4.8", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } @@ -33,9 +33,9 @@ num-traits = { version = "0.2.8", default-features = false } zeroize = { version = "1.0.0", default-features = false } lazy_static = { version = "1.4.0", default-features = false, optional = true } parking_lot = { version = "0.10.0", optional = true } -sp-debug-derive = { version = "2.0.0-alpha.8", path = "../debug-derive" } -sp-externalities = { version = "0.8.0-alpha.8", optional = true, path = "../externalities" } -sp-storage = { version = "2.0.0-alpha.8", default-features = false, path = "../storage" } +sp-debug-derive = { version = "2.0.0-dev", path = "../debug-derive" } +sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } +sp-storage = { version = "2.0.0-dev", default-features = false, path = "../storage" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } futures = { version = "0.3.1", optional = true } @@ -50,10 +50,10 @@ twox-hash = { version = "1.5.0", default-features = false, optional = true } libsecp256k1 = { version = "0.3.2", default-features = false, features = ["hmac"], optional = true } merlin = { version = "2.0", default-features = false, optional = true } -sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime-interface" } +sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../runtime-interface" } [dev-dependencies] -sp-serializer = { version = "2.0.0-alpha.8", path = "../serializer" } +sp-serializer = { version = "2.0.0-dev", path = "../serializer" } pretty_assertions = "0.6.1" hex-literal = "0.2.1" rand = "0.7.2" diff --git a/primitives/database/Cargo.toml b/primitives/database/Cargo.toml index b8ce17c8c6..ef65a8b940 100644 --- a/primitives/database/Cargo.toml +++ b/primitives/database/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-database" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/debug-derive/Cargo.toml b/primitives/debug-derive/Cargo.toml index d099f4917c..d620d2bc71 100644 --- a/primitives/debug-derive/Cargo.toml +++ b/primitives/debug-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-debug-derive" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 443885f94f..31dde81d7e 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-externalities" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,7 +13,7 @@ documentation = "https://docs.rs/sp-externalities" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-storage = { version = "2.0.0-alpha.8", path = "../storage" } -sp-std = { version = "2.0.0-alpha.8", path = "../std" } +sp-storage = { version = "2.0.0-dev", path = "../storage" } +sp-std = { version = "2.0.0-dev", path = "../std" } environmental = { version = "1.1.1" } codec = { package = "parity-scale-codec", version = "1.3.0" } diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index 54bbd3deb1..36af9319e7 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-grandpa" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } grandpa = { package = "finality-grandpa", version = "0.12.3", default-features = false, features = ["derive-codec"] } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/finality-tracker/Cargo.toml b/primitives/finality-tracker/Cargo.toml index cf8045d0d3..9e40cb8551 100644 --- a/primitives/finality-tracker/Cargo.toml +++ b/primitives/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-tracker" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } [features] default = ["std"] diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 49180b6192..287f4d7b9d 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-inherents" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = { version = "0.10.0", optional = true } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index df7f6ea1da..2bba4e94cb 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-io" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } hash-db = { version = "0.15.2", default-features = false } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } libsecp256k1 = { version = "0.3.4", optional = true } -sp-state-machine = { version = "0.8.0-alpha.8", optional = true, path = "../../primitives/state-machine" } -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../../primitives/wasm-interface", default-features = false } -sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime-interface" } -sp-trie = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-alpha.8", optional = true, path = "../externalities" } +sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } +sp-wasm-interface = { version = "2.0.0-dev", path = "../../primitives/wasm-interface", default-features = false } +sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../runtime-interface" } +sp-trie = { version = "2.0.0-dev", optional = true, path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } log = { version = "0.4.8", optional = true } futures = { version = "0.3.1", features = ["thread-pool"], optional = true } parking_lot = { version = "0.10.0", optional = true } diff --git a/primitives/keyring/Cargo.toml b/primitives/keyring/Cargo.toml index 18e814f311..b9fe7cb7a0 100644 --- a/primitives/keyring/Cargo.toml +++ b/primitives/keyring/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-keyring" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-alpha.8", path = "../core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sp-core = { version = "2.0.0-dev", path = "../core" } +sp-runtime = { version = "2.0.0-dev", path = "../runtime" } lazy_static = "1.4.0" strum = { version = "0.16.0", features = ["derive"] } diff --git a/primitives/offchain/Cargo.toml b/primitives/offchain/Cargo.toml index ad2f1ee453..1ed6c3342a 100644 --- a/primitives/offchain/Cargo.toml +++ b/primitives/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers primitives" name = "sp-offchain" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } [dev-dependencies] -sp-state-machine = { version = "0.8.0-alpha.8", default-features = false, path = "../state-machine" } +sp-state-machine = { version = "0.8.0-dev", default-features = false, path = "../state-machine" } [features] default = ["std"] diff --git a/primitives/panic-handler/Cargo.toml b/primitives/panic-handler/Cargo.toml index 161214d801..bc3ef2bdc6 100644 --- a/primitives/panic-handler/Cargo.toml +++ b/primitives/panic-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-panic-handler" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/Cargo.toml b/primitives/phragmen/Cargo.toml index 071b81a06b..3317b2fac0 100644 --- a/primitives/phragmen/Cargo.toml +++ b/primitives/phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-phragmen-compact = { version = "2.0.0-alpha.8", path = "./compact" } -sp-arithmetic = { version = "2.0.0-alpha.8", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-phragmen-compact = { version = "2.0.0-dev", path = "./compact" } +sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../arithmetic" } [dev-dependencies] -substrate-test-utils = { version = "2.0.0-alpha.8", path = "../../test-utils" } +substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } rand = "0.7.3" -sp-phragmen = { version = "2.0.0-alpha.8", path = "." } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-dev", path = "." } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } [features] default = ["std"] diff --git a/primitives/phragmen/compact/Cargo.toml b/primitives/phragmen/compact/Cargo.toml index d73af49679..1e5afd6c49 100644 --- a/primitives/phragmen/compact/Cargo.toml +++ b/primitives/phragmen/compact/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen-compact" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/fuzzer/Cargo.toml b/primitives/phragmen/fuzzer/Cargo.toml index 5a6b90925f..d81d23c476 100644 --- a/primitives/phragmen/fuzzer/Cargo.toml +++ b/primitives/phragmen/fuzzer/Cargo.toml @@ -14,9 +14,9 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-phragmen = { version = "2.0.0-alpha.8", path = ".." } -sp-std = { version = "2.0.0-alpha.8", path = "../../std" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } +sp-phragmen = { version = "2.0.0-dev", path = ".." } +sp-std = { version = "2.0.0-dev", path = "../../std" } +sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } honggfuzz = "0.5" rand = { version = "0.7.3", features = ["std", "small_rng"] } diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index ee64741b60..4c9dfb5d7b 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-rpc" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", path = "../core" } +sp-core = { version = "2.0.0-dev", path = "../core" } [dev-dependencies] serde_json = "1.0.41" diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index 75bed6ad7b..df1b32d73f 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,20 +13,20 @@ documentation = "https://docs.rs/sp-runtime-interface/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-wasm-interface = { version = "2.0.0-alpha.8", path = "../wasm-interface", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-tracing = { version = "2.0.0-alpha.8", default-features = false, path = "../tracing" } -sp-runtime-interface-proc-macro = { version = "2.0.0-alpha.8", path = "proc-macro" } -sp-externalities = { version = "0.8.0-alpha.8", optional = true, path = "../externalities" } +sp-wasm-interface = { version = "2.0.0-dev", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../tracing" } +sp-runtime-interface-proc-macro = { version = "2.0.0-dev", path = "proc-macro" } +sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } static_assertions = "1.0.0" primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] -sp-runtime-interface-test-wasm = { version = "2.0.0-alpha.8", path = "test-wasm" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } -sp-core = { version = "2.0.0-alpha.8", path = "../core" } -sp-io = { version = "2.0.0-alpha.8", path = "../io" } +sp-runtime-interface-test-wasm = { version = "2.0.0-dev", path = "test-wasm" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-dev", path = "../core" } +sp-io = { version = "2.0.0-dev", path = "../io" } rustversion = "1.0.0" trybuild = "1.0.23" diff --git a/primitives/runtime-interface/proc-macro/Cargo.toml b/primitives/runtime-interface/proc-macro/Cargo.toml index d8f39ba645..429168fe7b 100644 --- a/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/primitives/runtime-interface/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml index 461010f11c..5bf47afd78 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml +++ b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test-wasm/Cargo.toml b/primitives/runtime-interface/test-wasm/Cargo.toml index 4d9dd1b0b4..5029d4fa3e 100644 --- a/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/primitives/runtime-interface/test-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index 6a964dce47..3aab396e2e 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-alpha.8", path = "../" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } -sp-runtime-interface-test-wasm = { version = "2.0.0-alpha.8", path = "../test-wasm" } -sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-alpha.8", path = "../test-wasm-deprecated" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } -sp-core = { version = "2.0.0-alpha.8", path = "../../core" } -sp-io = { version = "2.0.0-alpha.8", path = "../../io" } +sp-runtime-interface = { version = "2.0.0-dev", path = "../" } +sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } +sp-runtime-interface-test-wasm = { version = "2.0.0-dev", path = "../test-wasm" } +sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-dev", path = "../test-wasm-deprecated" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-core = { version = "2.0.0-dev", path = "../../core" } +sp-io = { version = "2.0.0-dev", path = "../../io" } tracing = "0.1.13" diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index dad1691fcf..cc87a21f97 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,23 +16,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } -sp-arithmetic = { version = "2.0.0-alpha.8", default-features = false, path = "../arithmetic" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../io" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../io" } log = { version = "0.4.8", optional = true } paste = "0.1.6" rand = { version = "0.7.2", optional = true } impl-trait-for-tuples = "0.1.3" -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } hash256-std-hasher = { version = "0.15.2", default-features = false } [dev-dependencies] serde_json = "1.0.41" rand = "0.7.2" -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } [features] bench = [] diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index 3922897c01..73755d17c3 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-sandbox" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,10 +13,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../io" } -sp-wasm-interface = { version = "2.0.0-alpha.8", default-features = false, path = "../wasm-interface" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-dev", default-features = false, path = "../io" } +sp-wasm-interface = { version = "2.0.0-dev", default-features = false, path = "../wasm-interface" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [dev-dependencies] diff --git a/primitives/serializer/Cargo.toml b/primitives/serializer/Cargo.toml index 4ad0e350c7..ded058caa1 100644 --- a/primitives/serializer/Cargo.toml +++ b/primitives/serializer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-serializer" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index 50d930f00b..f910d85440 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-session" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-staking = { version = "2.0.0-alpha.8", default-features = false, path = "../staking" } -sp-runtime = { version = "2.0.0-alpha.8", optional = true, path = "../runtime" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-staking = { version = "2.0.0-dev", default-features = false, path = "../staking" } +sp-runtime = { version = "2.0.0-dev", optional = true, path = "../runtime" } [features] default = [ "std" ] diff --git a/primitives/staking/Cargo.toml b/primitives/staking/Cargo.toml index acf752bcde..f22e88855d 100644 --- a/primitives/staking/Cargo.toml +++ b/primitives/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-staking" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index b5f20b58de..470ad33fc3 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-state-machine" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" @@ -18,17 +18,17 @@ parking_lot = "0.10.0" hash-db = "0.15.2" trie-db = "0.20.1" trie-root = "0.16.0" -sp-trie = { version = "2.0.0-alpha.8", path = "../trie" } -sp-core = { version = "2.0.0-alpha.8", path = "../core" } -sp-panic-handler = { version = "2.0.0-alpha.8", path = "../panic-handler" } +sp-trie = { version = "2.0.0-dev", path = "../trie" } +sp-core = { version = "2.0.0-dev", path = "../core" } +sp-panic-handler = { version = "2.0.0-dev", path = "../panic-handler" } codec = { package = "parity-scale-codec", version = "1.3.0" } num-traits = "0.2.8" rand = "0.7.2" -sp-externalities = { version = "0.8.0-alpha.8", path = "../externalities" } +sp-externalities = { version = "0.8.0-dev", path = "../externalities" } [dev-dependencies] hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../runtime" } [features] default = [] diff --git a/primitives/std/Cargo.toml b/primitives/std/Cargo.toml index 21588803a5..8f9d626e25 100644 --- a/primitives/std/Cargo.toml +++ b/primitives/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-std" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/storage/Cargo.toml b/primitives/storage/Cargo.toml index 0023278cc8..a2ac2b1308 100644 --- a/primitives/storage/Cargo.toml +++ b/primitives/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-storage" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" description = "Storage related primitives" @@ -13,11 +13,11 @@ documentation = "https://docs.rs/sp-storage/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } impl-serde = { version = "0.2.3", optional = true } ref-cast = "1.0.0" -sp-debug-derive = { version = "2.0.0-alpha.8", path = "../debug-derive" } +sp-debug-derive = { version = "2.0.0-dev", path = "../debug-derive" } [features] default = [ "std" ] diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index 79b4dea000..b6d4972dd9 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-test-primitives" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } [features] diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 41ad1fa0b1..4279538c24 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-timestamp" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Substrate core types and inherents for timestamps." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } impl-trait-for-tuples = "0.1.3" wasm-timer = { version = "0.2", optional = true } diff --git a/primitives/tracing/Cargo.toml b/primitives/tracing/Cargo.toml index 64e8225f02..2bdf76bc06 100644 --- a/primitives/tracing/Cargo.toml +++ b/primitives/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-tracing" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/primitives/transaction-pool/Cargo.toml b/primitives/transaction-pool/Cargo.toml index e384325299..5acb86ade4 100644 --- a/primitives/transaction-pool/Cargo.toml +++ b/primitives/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-transaction-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,9 +19,9 @@ derive_more = { version = "0.99.2", optional = true } futures = { version = "0.3.1", optional = true } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", features = ["derive"], optional = true} -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } -sp-utils = { version = "2.0.0-alpha.8", default-features = false, path = "../utils" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-utils = { version = "2.0.0-dev", default-features = false, path = "../utils" } [features] default = [ "std" ] diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index ca459f3057..b3cf58ec59 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-trie" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/substrate/" @@ -18,19 +18,19 @@ harness = false [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } trie-db = { version = "0.20.1", default-features = false } trie-root = { version = "0.16.0", default-features = false } memory-db = { version = "0.20.0", default-features = false } -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } [dev-dependencies] trie-bench = "0.21.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-alpha.8", path = "../runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../runtime" } [features] default = ["std"] diff --git a/primitives/utils/Cargo.toml b/primitives/utils/Cargo.toml index d7efdf4942..7ed50c9f32 100644 --- a/primitives/utils/Cargo.toml +++ b/primitives/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index cf23c8f595..dc9f562ccd 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-version" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] impl-serde = { version = "0.2.3", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index b3f468a83a..d9d17b9edb 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-wasm-interface" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } impl-trait-for-tuples = "0.1.2" -sp-std = { version = "2.0.0-alpha.8", path = "../std", default-features = false } +sp-std = { version = "2.0.0-dev", path = "../std", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 48261b4eeb..e19592a82b 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index 5b71bc0051..082d9941d8 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-client" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,17 +12,17 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-alpha.8", path = "../../client/api" } -sc-client-db = { version = "0.8.0-alpha.8", features = ["test-helpers"], path = "../../client/db" } -sp-consensus = { version = "0.8.0-alpha.8", path = "../../primitives/consensus/common" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../client/executor" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../client/consensus/common" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, features = ["test-helpers"], path = "../../client/service" } +sc-client-api = { version = "2.0.0-dev", path = "../../client/api" } +sc-client-db = { version = "0.8.0-dev", features = ["test-helpers"], path = "../../client/db" } +sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sc-executor = { version = "0.8.0-dev", path = "../../client/executor" } +sc-consensus = { version = "0.8.0-dev", path = "../../client/consensus/common" } +sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../client/service" } futures = "0.3.4" hash-db = "0.15.2" -sp-keyring = { version = "2.0.0-alpha.8", path = "../../primitives/keyring" } +sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-core = { version = "2.0.0-alpha.8", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../primitives/runtime" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../primitives/blockchain" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 2a7cb9a234..6cd82ce029 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,35 +13,35 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/aura" } -sp-consensus-babe = { version = "0.8.0-alpha.8", default-features = false, path = "../../primitives/consensus/babe" } -sp-block-builder = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/block-builder" } +sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/aura" } +sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } +sp-block-builder = { version = "2.0.0-dev", default-features = false, path = "../../primitives/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-executive = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/executive" } -sp-inherents = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-alpha.8", optional = true, path = "../../primitives/keyring" } +frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../frame/executive" } +sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../primitives/keyring" } memory-db = { version = "0.20.0", default-features = false } -sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-alpha.8"} -sp-core = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/std" } -sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-alpha.8"} -sp-io = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/support" } -sp-version = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/version" } -sp-session = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/session" } -sp-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/runtime" } -pallet-babe = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/babe" } -frame-system = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/system" } -frame-system-rpc-runtime-api = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/system/rpc/runtime-api" } -pallet-timestamp = { version = "2.0.0-alpha.8", default-features = false, path = "../../frame/timestamp" } -sp-finality-grandpa = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/finality-grandpa" } -sp-trie = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/trie" } -sp-transaction-pool = { version = "2.0.0-alpha.8", default-features = false, path = "../../primitives/transaction-pool" } +sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-dev"} +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-dev"} +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-dev", default-features = false, path = "../../frame/support" } +sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } +sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } +sp-api = { version = "2.0.0-dev", default-features = false, path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../frame/babe" } +frame-system = { version = "2.0.0-dev", default-features = false, path = "../../frame/system" } +frame-system-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../frame/system/rpc/runtime-api" } +pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../frame/timestamp" } +sp-finality-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-grandpa" } +sp-trie = { version = "2.0.0-dev", default-features = false, path = "../../primitives/trie" } +sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../primitives/transaction-pool" } trie-db = { version = "0.20.1", default-features = false } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } -sc-service = { version = "0.8.0-alpha.8", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } +sc-service = { version = "0.8.0-dev", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } # 3rd party cfg-if = "0.1.10" @@ -49,10 +49,10 @@ log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } [dev-dependencies] -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../client/block-builder" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../client/executor" } -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "./client" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../primitives/state-machine" } +sc-block-builder = { version = "0.8.0-dev", path = "../../client/block-builder" } +sc-executor = { version = "0.8.0-dev", path = "../../client/executor" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "./client" } +sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../utils/wasm-builder-runner" } diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index 87e0884649..32091a8e00 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-client" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,16 +12,16 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-consensus = { version = "0.8.0-alpha.8", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-alpha.8", path = "../../../client/block-builder" } -substrate-test-client = { version = "2.0.0-alpha.8", path = "../../client" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -substrate-test-runtime = { version = "2.0.0-alpha.8", path = "../../runtime" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } +substrate-test-client = { version = "2.0.0-dev", path = "../../client" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +substrate-test-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../client/api" } -sc-consensus = { version = "0.8.0-alpha.8", path = "../../../client/consensus/common" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } +sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } +sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } futures = "0.3.4" diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml index 4f1c816d09..3184527308 100644 --- a/test-utils/runtime/transaction-pool/Cargo.toml +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../client" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../client" } parking_lot = "0.10.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../primitives/transaction-pool" } -sc-transaction-graph = { version = "2.0.0-alpha.8", path = "../../../client/transaction-pool/graph" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sc-transaction-graph = { version = "2.0.0-dev", path = "../../../client/transaction-pool/graph" } futures = { version = "0.3.1", features = ["compat"] } derive_more = "0.99.2" diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 35e798a392..ec37c8b139 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-browser-utils" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" @@ -22,11 +22,11 @@ js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" kvdb-web = "0.6" -sp-database = { version = "2.0.0-alpha.8", path = "../../primitives/database" } -sc-informant = { version = "0.8.0-alpha.8", path = "../../client/informant" } -sc-service = { version = "0.8.0-alpha.8", path = "../../client/service", default-features = false } -sc-network = { path = "../../client/network", version = "0.8.0-alpha.8"} -sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-alpha.8"} +sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } +sc-informant = { version = "0.8.0-dev", path = "../../client/informant" } +sc-service = { version = "0.8.0-dev", path = "../../client/service", default-features = false } +sc-network = { path = "../../client/network", version = "0.8.0-dev"} +sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-dev"} # Imported just for the `no_cc` feature clear_on_drop = { version = "0.2.3", features = ["no_cc"] } diff --git a/utils/build-script-utils/Cargo.toml b/utils/build-script-utils/Cargo.toml index 6c3f17be2b..72374a531c 100644 --- a/utils/build-script-utils/Cargo.toml +++ b/utils/build-script-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-build-script-utils" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/fork-tree/Cargo.toml b/utils/fork-tree/Cargo.toml index d663774bd7..7062a61ae5 100644 --- a/utils/fork-tree/Cargo.toml +++ b/utils/fork-tree/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fork-tree" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/frame/benchmarking-cli/Cargo.toml b/utils/frame/benchmarking-cli/Cargo.toml index 71bd64a0a6..fc681bd044 100644 --- a/utils/frame/benchmarking-cli/Cargo.toml +++ b/utils/frame/benchmarking-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking-cli" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,15 +12,15 @@ description = "CLI for benchmarking FRAME" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-benchmarking = { version = "2.0.0-alpha.8", path = "../../../frame/benchmarking" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../primitives/core" } -sc-service = { version = "0.8.0-alpha.8", default-features = false, path = "../../../client/service" } -sc-cli = { version = "0.8.0-alpha.8", path = "../../../client/cli" } -sc-client-db = { version = "0.8.0-alpha.8", path = "../../../client/db" } -sc-executor = { version = "0.8.0-alpha.8", path = "../../../client/executor" } -sp-externalities = { version = "0.8.0-alpha.8", path = "../../../primitives/externalities" } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-alpha.8", path = "../../../primitives/state-machine" } +frame-benchmarking = { version = "2.0.0-dev", path = "../../../frame/benchmarking" } +sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } +sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } +sc-client-db = { version = "0.8.0-dev", path = "../../../client/db" } +sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } +sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } +sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } structopt = "0.3.8" codec = { version = "1.3.0", package = "parity-scale-codec" } diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index 1dbb8b09a8..b086f6aa5f 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-support" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies ", "Andrew Dirksen "] edition = "2018" license = "Apache-2.0" @@ -17,10 +17,10 @@ jsonrpc-client-transports = { version = "14.0.5", default-features = false, feat jsonrpc-core = "14" codec = { package = "parity-scale-codec", version = "1" } serde = "1" -frame-support = { version = "2.0.0-alpha.8", path = "../../../../frame/support" } -sp-storage = { version = "2.0.0-alpha.8", path = "../../../../primitives/storage" } -sc-rpc-api = { version = "0.8.0-alpha.8", path = "../../../../client/rpc-api" } +frame-support = { version = "2.0.0-dev", path = "../../../../frame/support" } +sp-storage = { version = "2.0.0-dev", path = "../../../../primitives/storage" } +sc-rpc-api = { version = "0.8.0-dev", path = "../../../../client/rpc-api" } [dev-dependencies] -frame-system = { version = "2.0.0-alpha.8", path = "../../../../frame/system" } +frame-system = { version = "2.0.0-dev", path = "../../../../frame/system" } tokio = "0.2" diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 991878cef0..33fd3b399a 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-system" -version = "2.0.0-alpha.8" +version = "2.0.0-dev" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "FRAME's system exposed over Substrate RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-alpha.8", path = "../../../../client/api" } +sc-client-api = { version = "2.0.0-dev", path = "../../../../client/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.4", features = ["compat"] } jsonrpc-core = "14.0.3" @@ -20,14 +20,14 @@ jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" log = "0.4.8" serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-alpha.8", path = "../../../../primitives/runtime" } -sp-api = { version = "2.0.0-alpha.8", path = "../../../../primitives/api" } -frame-system-rpc-runtime-api = { version = "2.0.0-alpha.8", path = "../../../../frame/system/rpc/runtime-api" } -sp-core = { version = "2.0.0-alpha.8", path = "../../../../primitives/core" } -sp-blockchain = { version = "2.0.0-alpha.8", path = "../../../../primitives/blockchain" } -sp-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../../primitives/transaction-pool" } +sp-runtime = { version = "2.0.0-dev", path = "../../../../primitives/runtime" } +sp-api = { version = "2.0.0-dev", path = "../../../../primitives/api" } +frame-system-rpc-runtime-api = { version = "2.0.0-dev", path = "../../../../frame/system/rpc/runtime-api" } +sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } +sp-blockchain = { version = "2.0.0-dev", path = "../../../../primitives/blockchain" } +sp-transaction-pool = { version = "2.0.0-dev", path = "../../../../primitives/transaction-pool" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-alpha.8", path = "../../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } env_logger = "0.7.0" -sc-transaction-pool = { version = "2.0.0-alpha.8", path = "../../../../client/transaction-pool" } +sc-transaction-pool = { version = "2.0.0-dev", path = "../../../../client/transaction-pool" } diff --git a/utils/prometheus/Cargo.toml b/utils/prometheus/Cargo.toml index c425a7c879..9ecf5325cd 100644 --- a/utils/prometheus/Cargo.toml +++ b/utils/prometheus/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Endpoint to expose Prometheus metrics" name = "substrate-prometheus-endpoint" -version = "0.8.0-alpha.8" +version = "0.8.0-dev" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 5a7600912b7fd50091990899e8ad93ad618f40c4 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sat, 16 May 2020 21:59:11 +0200 Subject: [PATCH 065/150] Remove file accounts.scale (#6053) --- frame/system/src/accounts.scale | Bin 181794 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 frame/system/src/accounts.scale diff --git a/frame/system/src/accounts.scale b/frame/system/src/accounts.scale deleted file mode 100644 index bfd7e6277f20c53ceb1d664235bb6af18ec538ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181794 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 BWLch^Byz8quu88lkI}kJ;m1n0hl& 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 e#8CsHht3 Date: Mon, 18 May 2020 13:28:20 +0200 Subject: [PATCH 066/150] Fail test on warnings (#6043) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix (ci): hotfix Docker release * change (ci): fail test on warnings * change (config): stderr msgs * Fix the warnings properly Co-authored-by: Bastian Köcher --- .gitlab-ci.yml | 13 ++----------- .../api/test/tests/ui/declaring_old_block.rs | 2 -- .../api/test/tests/ui/declaring_old_block.stderr | 16 ++++------------ .../declaring_own_block_with_different_name.rs | 2 -- ...eclaring_own_block_with_different_name.stderr | 12 ++---------- .../tests/ui/impl_two_traits_with_same_name.rs | 2 -- .../ui/impl_two_traits_with_same_name.stderr | 12 ++---------- .../test/tests/ui/mock_only_one_block_type.rs | 2 -- .../tests/ui/mock_only_one_block_type.stderr | 16 ++++------------ .../api/test/tests/ui/mock_only_one_self_type.rs | 2 -- .../test/tests/ui/mock_only_one_self_type.stderr | 16 ++++------------ 11 files changed, 18 insertions(+), 77 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c06ace76c..12ae9bfc61 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -193,22 +193,13 @@ test-linux-stable: &test-linux variables: # Enable debug assertions since we are running optimized builds for testing # but still want to have debug assertions. - RUSTFLAGS: -Cdebug-assertions=y + RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" except: variables: - $DEPLOY_TAG script: - - WASM_BUILD_NO_COLOR=1 time cargo test --all --release --verbose --locked |& - tee output.log + - WASM_BUILD_NO_COLOR=1 time cargo test --all --release --verbose --locked - sccache -s - - echo "____Test job successful, checking for warnings____" - - awk '/^warning:/,/^$/ { print }' output.log > ${CI_COMMIT_SHORT_SHA}_warnings.log - - if [ -s ${CI_COMMIT_SHORT_SHA}_warnings.log ]; then - cat ${CI_COMMIT_SHORT_SHA}_warnings.log; - exit 1; - else - echo "___No warnings___"; - fi test-dependency-rules: stage: test diff --git a/primitives/api/test/tests/ui/declaring_old_block.rs b/primitives/api/test/tests/ui/declaring_old_block.rs index ba98bf9bf6..fb74159028 100644 --- a/primitives/api/test/tests/ui/declaring_old_block.rs +++ b/primitives/api/test/tests/ui/declaring_old_block.rs @@ -1,5 +1,3 @@ -use sp_runtime::traits::Block as BlockT; - sp_api::decl_runtime_apis! { pub trait Api { fn test(); diff --git a/primitives/api/test/tests/ui/declaring_old_block.stderr b/primitives/api/test/tests/ui/declaring_old_block.stderr index 448dc38594..50dd37582c 100644 --- a/primitives/api/test/tests/ui/declaring_old_block.stderr +++ b/primitives/api/test/tests/ui/declaring_old_block.stderr @@ -1,19 +1,11 @@ error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. - --> $DIR/declaring_old_block.rs:4:23 + --> $DIR/declaring_old_block.rs:2:23 | -4 | pub trait Api { +2 | pub trait Api { | ^^^^^^ error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! - --> $DIR/declaring_old_block.rs:4:16 + --> $DIR/declaring_old_block.rs:2:16 | -4 | pub trait Api { +2 | pub trait Api { | ^^^^^ - -warning: unused import: `sp_runtime::traits::Block as BlockT` - --> $DIR/declaring_old_block.rs:1:5 - | -1 | use sp_runtime::traits::Block as BlockT; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default diff --git a/primitives/api/test/tests/ui/declaring_own_block_with_different_name.rs b/primitives/api/test/tests/ui/declaring_own_block_with_different_name.rs index 67bb9cab10..e3c7ae8a39 100644 --- a/primitives/api/test/tests/ui/declaring_own_block_with_different_name.rs +++ b/primitives/api/test/tests/ui/declaring_own_block_with_different_name.rs @@ -1,5 +1,3 @@ -use sp_runtime::traits::Block as BlockT; - sp_api::decl_runtime_apis! { pub trait Api { fn test(); diff --git a/primitives/api/test/tests/ui/declaring_own_block_with_different_name.stderr b/primitives/api/test/tests/ui/declaring_own_block_with_different_name.stderr index fe445b822d..778de3c9d1 100644 --- a/primitives/api/test/tests/ui/declaring_own_block_with_different_name.stderr +++ b/primitives/api/test/tests/ui/declaring_own_block_with_different_name.stderr @@ -1,13 +1,5 @@ error: `Block: BlockT` generic parameter will be added automatically by the `decl_runtime_apis!` macro! If you try to use a different trait than the substrate `Block` trait, please rename it locally. - --> $DIR/declaring_own_block_with_different_name.rs:4:19 + --> $DIR/declaring_own_block_with_different_name.rs:2:19 | -4 | pub trait Api { +2 | pub trait Api { | ^^^^^^ - -warning: unused import: `sp_runtime::traits::Block as BlockT` - --> $DIR/declaring_own_block_with_different_name.rs:1:5 - | -1 | use sp_runtime::traits::Block as BlockT; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default diff --git a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs index 2122a6991a..76555a825d 100644 --- a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs +++ b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.rs @@ -15,8 +15,6 @@ sp_api::decl_runtime_apis! { } mod second { - use super::*; - sp_api::decl_runtime_apis! { pub trait Api { fn test2(data: u64); diff --git a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr index 24ee66f84b..17ee56d409 100644 --- a/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr +++ b/primitives/api/test/tests/ui/impl_two_traits_with_same_name.stderr @@ -1,13 +1,5 @@ error: Two traits with the same name detected! The trait name is used to generate its ID. Please rename one trait at the declaration! - --> $DIR/impl_two_traits_with_same_name.rs:32:15 + --> $DIR/impl_two_traits_with_same_name.rs:30:15 | -32 | impl second::Api for Runtime { +30 | impl second::Api for Runtime { | ^^^ - -warning: unused import: `super::*` - --> $DIR/impl_two_traits_with_same_name.rs:18:6 - | -18 | use super::*; - | ^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default diff --git a/primitives/api/test/tests/ui/mock_only_one_block_type.rs b/primitives/api/test/tests/ui/mock_only_one_block_type.rs index 969b21d737..f49cafd23a 100644 --- a/primitives/api/test/tests/ui/mock_only_one_block_type.rs +++ b/primitives/api/test/tests/ui/mock_only_one_block_type.rs @@ -1,5 +1,3 @@ -use substrate_test_runtime_client::runtime::Block; - struct Block2; sp_api::decl_runtime_apis! { diff --git a/primitives/api/test/tests/ui/mock_only_one_block_type.stderr b/primitives/api/test/tests/ui/mock_only_one_block_type.stderr index 1abc8db726..1831d0485b 100644 --- a/primitives/api/test/tests/ui/mock_only_one_block_type.stderr +++ b/primitives/api/test/tests/ui/mock_only_one_block_type.stderr @@ -1,19 +1,11 @@ error: Block type should be the same between all runtime apis. - --> $DIR/mock_only_one_block_type.rs:22:12 + --> $DIR/mock_only_one_block_type.rs:20:12 | -22 | impl Api2 for MockApi { +20 | impl Api2 for MockApi { | ^^^^^^ error: First block type found here - --> $DIR/mock_only_one_block_type.rs:18:11 + --> $DIR/mock_only_one_block_type.rs:16:11 | -18 | impl Api for MockApi { +16 | impl Api for MockApi { | ^^^^^ - -warning: unused import: `substrate_test_runtime_client::runtime::Block` - --> $DIR/mock_only_one_block_type.rs:1:5 - | -1 | use substrate_test_runtime_client::runtime::Block; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default diff --git a/primitives/api/test/tests/ui/mock_only_one_self_type.rs b/primitives/api/test/tests/ui/mock_only_one_self_type.rs index 4b29ec2a6a..617031b4d5 100644 --- a/primitives/api/test/tests/ui/mock_only_one_self_type.rs +++ b/primitives/api/test/tests/ui/mock_only_one_self_type.rs @@ -1,5 +1,3 @@ -use substrate_test_runtime_client::runtime::Block; - sp_api::decl_runtime_apis! { pub trait Api { fn test(data: u64); diff --git a/primitives/api/test/tests/ui/mock_only_one_self_type.stderr b/primitives/api/test/tests/ui/mock_only_one_self_type.stderr index 996d1d44c0..5f1e29b281 100644 --- a/primitives/api/test/tests/ui/mock_only_one_self_type.stderr +++ b/primitives/api/test/tests/ui/mock_only_one_self_type.stderr @@ -1,19 +1,11 @@ error: Self type should not change between runtime apis - --> $DIR/mock_only_one_self_type.rs:21:23 + --> $DIR/mock_only_one_self_type.rs:19:23 | -21 | impl Api2 for MockApi2 { +19 | impl Api2 for MockApi2 { | ^^^^^^^^ error: First self type found here - --> $DIR/mock_only_one_self_type.rs:17:22 + --> $DIR/mock_only_one_self_type.rs:15:22 | -17 | impl Api for MockApi { +15 | impl Api for MockApi { | ^^^^^^^ - -warning: unused import: `substrate_test_runtime_client::runtime::Block` - --> $DIR/mock_only_one_self_type.rs:1:5 - | -1 | use substrate_test_runtime_client::runtime::Block; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `#[warn(unused_imports)]` on by default -- GitLab From f9fe88f947820031efcaf3244527c53fcee52e3d Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 18 May 2020 14:51:28 +0300 Subject: [PATCH 067/150] fix whitespace (#6062) --- bin/node/bench/src/core.rs | 2 +- bin/node/bench/src/generator.rs | 2 +- bin/node/bench/src/import.rs | 2 +- bin/node/bench/src/main.rs | 2 +- bin/node/bench/src/simple_trie.rs | 2 +- bin/node/bench/src/tempdb.rs | 2 +- bin/node/bench/src/trie.rs | 2 +- bin/node/cli/bin/main.rs | 2 +- bin/node/cli/build.rs | 2 +- bin/node/cli/src/browser.rs | 2 +- bin/node/cli/src/chain_spec.rs | 2 +- bin/node/cli/src/cli.rs | 2 +- bin/node/cli/src/command.rs | 2 +- bin/node/cli/src/lib.rs | 2 +- bin/node/cli/src/service.rs | 2 +- bin/node/cli/tests/build_spec_works.rs | 2 +- bin/node/cli/tests/check_block_works.rs | 2 +- bin/node/cli/tests/common.rs | 2 +- bin/node/cli/tests/import_export_and_revert_work.rs | 2 +- bin/node/cli/tests/inspect_works.rs | 2 +- bin/node/cli/tests/purge_chain_works.rs | 2 +- bin/node/cli/tests/running_the_node_and_interrupt.rs | 2 +- bin/node/cli/tests/version.rs | 2 +- bin/node/inspect/src/cli.rs | 2 +- bin/node/inspect/src/command.rs | 2 +- bin/node/inspect/src/lib.rs | 10 +++++----- bin/node/runtime/src/lib.rs | 2 +- bin/node/testing/src/bench.rs | 2 +- bin/node/testing/src/client.rs | 2 +- bin/node/testing/src/genesis.rs | 2 +- bin/node/testing/src/keyring.rs | 2 +- bin/node/testing/src/lib.rs | 2 +- bin/utils/chain-spec-builder/build.rs | 2 +- bin/utils/chain-spec-builder/src/main.rs | 2 +- bin/utils/subkey/src/main.rs | 4 ++-- bin/utils/subkey/src/rpc.rs | 2 +- bin/utils/subkey/src/vanity.rs | 2 +- client/api/src/backend.rs | 2 +- client/api/src/call_executor.rs | 2 +- client/api/src/cht.rs | 2 +- client/api/src/in_mem.rs | 2 +- client/api/src/leaves.rs | 2 +- client/api/src/notifications.rs | 2 +- client/api/src/proof_provider.rs | 2 +- client/authority-discovery/src/tests.rs | 2 +- client/basic-authorship/src/basic_authorship.rs | 2 +- client/basic-authorship/src/lib.rs | 2 +- client/block-builder/src/lib.rs | 2 +- client/chain-spec/src/chain_spec.rs | 2 +- client/cli/src/arg_enums.rs | 2 +- client/cli/src/commands/build_spec_cmd.rs | 2 +- client/cli/src/commands/check_block_cmd.rs | 2 +- client/cli/src/commands/export_blocks_cmd.rs | 2 +- client/cli/src/commands/export_state_cmd.rs | 2 +- client/cli/src/commands/import_blocks_cmd.rs | 2 +- client/cli/src/commands/mod.rs | 2 +- client/cli/src/commands/purge_chain_cmd.rs | 2 +- client/cli/src/commands/revert_cmd.rs | 2 +- client/cli/src/commands/run_cmd.rs | 2 +- client/cli/src/config.rs | 2 +- client/cli/src/error.rs | 2 +- client/cli/src/lib.rs | 2 +- client/cli/src/params/database_params.rs | 2 +- client/cli/src/params/import_params.rs | 2 +- client/cli/src/params/keystore_params.rs | 2 +- client/cli/src/params/mod.rs | 2 +- client/cli/src/params/network_params.rs | 2 +- client/cli/src/params/node_key_params.rs | 2 +- client/cli/src/params/offchain_worker_params.rs | 2 +- client/cli/src/params/pruning_params.rs | 2 +- client/cli/src/params/shared_params.rs | 2 +- client/cli/src/params/transaction_pool_params.rs | 2 +- client/cli/src/runner.rs | 2 +- client/consensus/aura/src/digests.rs | 2 +- client/consensus/aura/src/lib.rs | 2 +- client/consensus/babe/rpc/src/lib.rs | 2 +- client/consensus/manual-seal/src/error.rs | 2 +- client/consensus/manual-seal/src/lib.rs | 2 +- client/consensus/pow/src/lib.rs | 2 +- client/db/src/bench.rs | 2 +- client/db/src/cache/list_cache.rs | 4 ++-- client/db/src/cache/list_entry.rs | 2 +- client/db/src/cache/list_storage.rs | 2 +- client/db/src/cache/mod.rs | 2 +- client/db/src/lib.rs | 2 +- client/db/src/light.rs | 2 +- client/db/src/offchain.rs | 2 +- client/db/src/parity_db.rs | 2 +- client/db/src/stats.rs | 2 +- client/db/src/subdb.rs | 2 +- client/db/src/utils.rs | 2 +- client/executor/common/src/error.rs | 2 +- client/executor/common/src/sandbox.rs | 2 +- client/executor/common/src/util.rs | 2 +- client/executor/src/integration_tests/mod.rs | 2 +- client/executor/src/integration_tests/sandbox.rs | 2 +- client/executor/src/lib.rs | 2 +- client/executor/src/native_executor.rs | 2 +- client/executor/wasmtime/src/imports.rs | 2 +- client/executor/wasmtime/src/instance_wrapper.rs | 2 +- .../wasmtime/src/instance_wrapper/globals_snapshot.rs | 2 +- client/executor/wasmtime/src/state_holder.rs | 2 +- client/finality-grandpa/rpc/src/error.rs | 2 +- client/finality-grandpa/rpc/src/lib.rs | 2 +- client/finality-grandpa/rpc/src/report.rs | 2 +- client/finality-grandpa/src/authorities.rs | 2 +- client/finality-grandpa/src/communication/mod.rs | 2 +- client/finality-grandpa/src/environment.rs | 2 +- client/finality-grandpa/src/finality_proof.rs | 2 +- client/finality-grandpa/src/import.rs | 2 +- client/finality-grandpa/src/justification.rs | 2 +- client/finality-grandpa/src/lib.rs | 2 +- client/finality-grandpa/src/observer.rs | 2 +- client/finality-grandpa/src/tests.rs | 2 +- client/finality-grandpa/src/until_imported.rs | 2 +- client/finality-grandpa/src/voting_rule.rs | 2 +- client/informant/src/lib.rs | 2 +- client/network-gossip/src/state_machine.rs | 2 +- client/network-gossip/src/validator.rs | 2 +- client/network/src/chain.rs | 2 +- client/network/src/config.rs | 2 +- client/network/src/error.rs | 2 +- client/network/src/lib.rs | 2 +- client/network/src/network_state.rs | 2 +- client/network/src/on_demand_layer.rs | 2 +- client/network/src/protocol.rs | 2 +- client/network/src/protocol/generic_proto/handler.rs | 2 +- .../src/protocol/generic_proto/handler/notif_in.rs | 2 +- client/network/src/protocol/generic_proto/upgrade.rs | 2 +- .../src/protocol/generic_proto/upgrade/legacy.rs | 2 +- client/network/src/protocol/message.rs | 2 +- client/network/src/protocol/sync/blocks.rs | 2 +- client/network/src/protocol/sync/extra_requests.rs | 2 +- client/network/src/schema.rs | 2 +- client/network/src/service.rs | 2 +- client/network/src/service/out_events.rs | 2 +- client/network/src/service/tests.rs | 2 +- client/network/src/transport.rs | 2 +- client/network/test/src/block_import.rs | 2 +- client/network/test/src/lib.rs | 2 +- client/network/test/src/sync.rs | 2 +- client/peerset/src/lib.rs | 2 +- client/peerset/tests/fuzz.rs | 2 +- client/rpc-api/src/author/error.rs | 2 +- client/rpc-api/src/author/mod.rs | 2 +- client/rpc-api/src/chain/error.rs | 2 +- client/rpc-api/src/chain/mod.rs | 2 +- client/rpc-api/src/child_state/mod.rs | 2 +- client/rpc-api/src/errors.rs | 2 +- client/rpc-api/src/helpers.rs | 2 +- client/rpc-api/src/offchain/error.rs | 2 +- client/rpc-api/src/offchain/mod.rs | 2 +- client/rpc-api/src/policy.rs | 2 +- client/rpc-api/src/state/error.rs | 2 +- client/rpc-api/src/state/helpers.rs | 2 +- client/rpc-api/src/state/mod.rs | 2 +- client/rpc-api/src/subscriptions.rs | 2 +- client/rpc-api/src/system/error.rs | 2 +- client/rpc-api/src/system/helpers.rs | 2 +- client/rpc-api/src/system/mod.rs | 2 +- client/rpc-servers/src/lib.rs | 2 +- client/rpc/src/author/mod.rs | 2 +- client/rpc/src/author/tests.rs | 2 +- client/rpc/src/chain/mod.rs | 2 +- client/rpc/src/chain/tests.rs | 2 +- client/rpc/src/lib.rs | 2 +- client/rpc/src/metadata.rs | 2 +- client/rpc/src/offchain/mod.rs | 2 +- client/rpc/src/offchain/tests.rs | 2 +- client/rpc/src/state/mod.rs | 2 +- client/rpc/src/state/tests.rs | 2 +- client/rpc/src/system/mod.rs | 2 +- client/rpc/src/system/tests.rs | 2 +- client/rpc/src/testing.rs | 2 +- client/service/src/builder.rs | 2 +- client/service/src/chain_ops.rs | 2 +- client/service/src/client/block_rules.rs | 2 +- client/service/src/client/call_executor.rs | 2 +- client/service/src/client/client.rs | 2 +- client/service/src/client/genesis.rs | 2 +- client/service/src/client/light/backend.rs | 2 +- client/service/src/client/light/blockchain.rs | 2 +- client/service/src/client/light/call_executor.rs | 2 +- client/service/src/client/light/fetcher.rs | 2 +- client/service/src/client/light/mod.rs | 2 +- client/service/src/client/mod.rs | 2 +- client/service/src/config.rs | 2 +- client/service/src/error.rs | 2 +- client/service/src/lib.rs | 2 +- client/service/src/metrics.rs | 2 +- client/service/test/src/client/db.rs | 2 +- client/service/test/src/client/light.rs | 2 +- client/service/test/src/client/mod.rs | 2 +- client/service/test/src/lib.rs | 2 +- client/state-db/src/lib.rs | 2 +- client/state-db/src/noncanonical.rs | 2 +- client/state-db/src/pruning.rs | 2 +- client/state-db/src/test.rs | 2 +- client/telemetry/src/lib.rs | 2 +- client/telemetry/src/worker.rs | 2 +- client/telemetry/src/worker/node.rs | 2 +- client/transaction-pool/graph/benches/basics.rs | 2 +- client/transaction-pool/graph/src/base_pool.rs | 2 +- client/transaction-pool/graph/src/error.rs | 2 +- client/transaction-pool/graph/src/future.rs | 2 +- client/transaction-pool/graph/src/lib.rs | 2 +- client/transaction-pool/graph/src/listener.rs | 2 +- client/transaction-pool/graph/src/pool.rs | 2 +- client/transaction-pool/graph/src/ready.rs | 2 +- client/transaction-pool/graph/src/rotator.rs | 2 +- client/transaction-pool/graph/src/validated_pool.rs | 2 +- client/transaction-pool/graph/src/watcher.rs | 2 +- client/transaction-pool/src/api.rs | 2 +- client/transaction-pool/src/error.rs | 2 +- client/transaction-pool/src/lib.rs | 2 +- client/transaction-pool/src/metrics.rs | 2 +- client/transaction-pool/src/revalidation.rs | 2 +- client/transaction-pool/src/testing/mod.rs | 2 +- client/transaction-pool/src/testing/pool.rs | 2 +- 219 files changed, 225 insertions(+), 225 deletions(-) diff --git a/bin/node/bench/src/core.rs b/bin/node/bench/src/core.rs index ca297b1a90..a3c25f9ce3 100644 --- a/bin/node/bench/src/core.rs +++ b/bin/node/bench/src/core.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/bench/src/generator.rs b/bin/node/bench/src/generator.rs index a42dbd748f..759a4299c7 100644 --- a/bin/node/bench/src/generator.rs +++ b/bin/node/bench/src/generator.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/bench/src/import.rs b/bin/node/bench/src/import.rs index d98b54ce70..5cbb851867 100644 --- a/bin/node/bench/src/import.rs +++ b/bin/node/bench/src/import.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/bench/src/main.rs b/bin/node/bench/src/main.rs index fbf203d29e..419aacb6a5 100644 --- a/bin/node/bench/src/main.rs +++ b/bin/node/bench/src/main.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/bench/src/simple_trie.rs b/bin/node/bench/src/simple_trie.rs index 01ad1bb9b4..3cfd7ddb30 100644 --- a/bin/node/bench/src/simple_trie.rs +++ b/bin/node/bench/src/simple_trie.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/bench/src/tempdb.rs b/bin/node/bench/src/tempdb.rs index 19f9b9099c..770bafec6f 100644 --- a/bin/node/bench/src/tempdb.rs +++ b/bin/node/bench/src/tempdb.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/bench/src/trie.rs b/bin/node/bench/src/trie.rs index ada18c1016..886dc60114 100644 --- a/bin/node/bench/src/trie.rs +++ b/bin/node/bench/src/trie.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/bin/main.rs b/bin/node/cli/bin/main.rs index 1d0fa639c0..299b760c82 100644 --- a/bin/node/cli/bin/main.rs +++ b/bin/node/cli/bin/main.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/build.rs b/bin/node/cli/build.rs index 1c47dadc8d..a36f0d01a0 100644 --- a/bin/node/cli/build.rs +++ b/bin/node/cli/build.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/src/browser.rs b/bin/node/cli/src/browser.rs index df74ef3f75..8d74e3cbf3 100644 --- a/bin/node/cli/src/browser.rs +++ b/bin/node/cli/src/browser.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/src/chain_spec.rs b/bin/node/cli/src/chain_spec.rs index 6688c08b8a..c1eadc2f93 100644 --- a/bin/node/cli/src/chain_spec.rs +++ b/bin/node/cli/src/chain_spec.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/src/cli.rs b/bin/node/cli/src/cli.rs index a653279064..0156faf47e 100644 --- a/bin/node/cli/src/cli.rs +++ b/bin/node/cli/src/cli.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/src/command.rs b/bin/node/cli/src/command.rs index 3034c81bac..bd5483f2cd 100644 --- a/bin/node/cli/src/command.rs +++ b/bin/node/cli/src/command.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/src/lib.rs b/bin/node/cli/src/lib.rs index 8edfb5e3fb..bd2298514a 100644 --- a/bin/node/cli/src/lib.rs +++ b/bin/node/cli/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index ee6d11de57..f39d96e1d6 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/build_spec_works.rs b/bin/node/cli/tests/build_spec_works.rs index a6fa2ad4e2..800a4a8c51 100644 --- a/bin/node/cli/tests/build_spec_works.rs +++ b/bin/node/cli/tests/build_spec_works.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/check_block_works.rs b/bin/node/cli/tests/check_block_works.rs index 209b1122aa..0b340dad64 100644 --- a/bin/node/cli/tests/check_block_works.rs +++ b/bin/node/cli/tests/check_block_works.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/common.rs b/bin/node/cli/tests/common.rs index a9df32d792..51f88cd92b 100644 --- a/bin/node/cli/tests/common.rs +++ b/bin/node/cli/tests/common.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/import_export_and_revert_work.rs b/bin/node/cli/tests/import_export_and_revert_work.rs index 2655645617..91c8b024e1 100644 --- a/bin/node/cli/tests/import_export_and_revert_work.rs +++ b/bin/node/cli/tests/import_export_and_revert_work.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/inspect_works.rs b/bin/node/cli/tests/inspect_works.rs index 6787244876..59bdaf7de3 100644 --- a/bin/node/cli/tests/inspect_works.rs +++ b/bin/node/cli/tests/inspect_works.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/purge_chain_works.rs b/bin/node/cli/tests/purge_chain_works.rs index b57084092d..8d637be3e8 100644 --- a/bin/node/cli/tests/purge_chain_works.rs +++ b/bin/node/cli/tests/purge_chain_works.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs index fb241e177e..a8c4be4695 100644 --- a/bin/node/cli/tests/running_the_node_and_interrupt.rs +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/cli/tests/version.rs b/bin/node/cli/tests/version.rs index 8d8b3a5ce0..c5240257f1 100644 --- a/bin/node/cli/tests/version.rs +++ b/bin/node/cli/tests/version.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/inspect/src/cli.rs b/bin/node/inspect/src/cli.rs index 3a71407ab0..4475d31755 100644 --- a/bin/node/inspect/src/cli.rs +++ b/bin/node/inspect/src/cli.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/inspect/src/command.rs b/bin/node/inspect/src/command.rs index c409aee86e..fae6c10c7f 100644 --- a/bin/node/inspect/src/command.rs +++ b/bin/node/inspect/src/command.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/inspect/src/lib.rs b/bin/node/inspect/src/lib.rs index 5123fc5959..02f5614b81 100644 --- a/bin/node/inspect/src/lib.rs +++ b/bin/node/inspect/src/lib.rs @@ -1,18 +1,18 @@ // This file is part of Substrate. -// +// // Copyright (C) 2020 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 -// +// // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. -// +// // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program. If not, see . diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 12c105e940..a7974d9d71 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/testing/src/bench.rs b/bin/node/testing/src/bench.rs index 888ec71cda..6c687d2f2a 100644 --- a/bin/node/testing/src/bench.rs +++ b/bin/node/testing/src/bench.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/testing/src/client.rs b/bin/node/testing/src/client.rs index 5d2795a6f6..f44747b26b 100644 --- a/bin/node/testing/src/client.rs +++ b/bin/node/testing/src/client.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index f99b559a25..d9c7e24709 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/testing/src/keyring.rs b/bin/node/testing/src/keyring.rs index 99a44e065d..efa47a5982 100644 --- a/bin/node/testing/src/keyring.rs +++ b/bin/node/testing/src/keyring.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/node/testing/src/lib.rs b/bin/node/testing/src/lib.rs index 07859f5fed..d682347e40 100644 --- a/bin/node/testing/src/lib.rs +++ b/bin/node/testing/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/utils/chain-spec-builder/build.rs b/bin/utils/chain-spec-builder/build.rs index cf8afddb54..8d5aac1a08 100644 --- a/bin/utils/chain-spec-builder/build.rs +++ b/bin/utils/chain-spec-builder/build.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/utils/chain-spec-builder/src/main.rs b/bin/utils/chain-spec-builder/src/main.rs index 1561b3a6b0..4fbcc1e850 100644 --- a/bin/utils/chain-spec-builder/src/main.rs +++ b/bin/utils/chain-spec-builder/src/main.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index da4f59430f..898e99f062 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, @@ -525,7 +525,7 @@ where let account_id: AccountId = ModuleId(id_fixed_array).into_account(); let v = maybe_network.unwrap_or(Ss58AddressFormat::SubstrateAccount); - + C::print_from_uri(&account_id.to_ss58check_with_version(v), password, maybe_network, output); } _ => print_usage(&matches), diff --git a/bin/utils/subkey/src/rpc.rs b/bin/utils/subkey/src/rpc.rs index c6c63be4d1..e24cf50dc4 100644 --- a/bin/utils/subkey/src/rpc.rs +++ b/bin/utils/subkey/src/rpc.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/bin/utils/subkey/src/vanity.rs b/bin/utils/subkey/src/vanity.rs index 83a71659d8..d09aeeef25 100644 --- a/bin/utils/subkey/src/vanity.rs +++ b/bin/utils/subkey/src/vanity.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/backend.rs b/client/api/src/backend.rs index fd9577695a..6a7114fcc8 100644 --- a/client/api/src/backend.rs +++ b/client/api/src/backend.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/call_executor.rs b/client/api/src/call_executor.rs index 8c69eb8caa..e5b670579a 100644 --- a/client/api/src/call_executor.rs +++ b/client/api/src/call_executor.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/cht.rs b/client/api/src/cht.rs index 55a38a5149..ef282868c9 100644 --- a/client/api/src/cht.rs +++ b/client/api/src/cht.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/in_mem.rs b/client/api/src/in_mem.rs index 07df822488..cb1724e468 100644 --- a/client/api/src/in_mem.rs +++ b/client/api/src/in_mem.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/leaves.rs b/client/api/src/leaves.rs index e89aeed8d1..c93446b94d 100644 --- a/client/api/src/leaves.rs +++ b/client/api/src/leaves.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/notifications.rs b/client/api/src/notifications.rs index 72071eb20c..c89e8b6dfd 100644 --- a/client/api/src/notifications.rs +++ b/client/api/src/notifications.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/api/src/proof_provider.rs b/client/api/src/proof_provider.rs index 66039b9601..5749ae0576 100644 --- a/client/api/src/proof_provider.rs +++ b/client/api/src/proof_provider.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index 09c0319d29..106c68b2d0 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/basic-authorship/src/basic_authorship.rs b/client/basic-authorship/src/basic_authorship.rs index 2deecc72b9..0c1346b368 100644 --- a/client/basic-authorship/src/basic_authorship.rs +++ b/client/basic-authorship/src/basic_authorship.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index bebce17059..7f88844d90 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index 730fe0258e..f630d42a9b 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index 333aa6fb5c..a6bf6212e1 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/arg_enums.rs b/client/cli/src/arg_enums.rs index 3269a702fd..4dfd384d95 100644 --- a/client/cli/src/arg_enums.rs +++ b/client/cli/src/arg_enums.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/build_spec_cmd.rs b/client/cli/src/commands/build_spec_cmd.rs index ca927adacd..e5e7123b4b 100644 --- a/client/cli/src/commands/build_spec_cmd.rs +++ b/client/cli/src/commands/build_spec_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/check_block_cmd.rs b/client/cli/src/commands/check_block_cmd.rs index 7d5110a29c..35f26af667 100644 --- a/client/cli/src/commands/check_block_cmd.rs +++ b/client/cli/src/commands/check_block_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/export_blocks_cmd.rs b/client/cli/src/commands/export_blocks_cmd.rs index b23f16d884..431add4128 100644 --- a/client/cli/src/commands/export_blocks_cmd.rs +++ b/client/cli/src/commands/export_blocks_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/export_state_cmd.rs b/client/cli/src/commands/export_state_cmd.rs index 45b943ba3e..ee022e1afd 100644 --- a/client/cli/src/commands/export_state_cmd.rs +++ b/client/cli/src/commands/export_state_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/import_blocks_cmd.rs b/client/cli/src/commands/import_blocks_cmd.rs index 4690eb23f0..029e447562 100644 --- a/client/cli/src/commands/import_blocks_cmd.rs +++ b/client/cli/src/commands/import_blocks_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/mod.rs b/client/cli/src/commands/mod.rs index c1fd9e0328..62757890ef 100644 --- a/client/cli/src/commands/mod.rs +++ b/client/cli/src/commands/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/purge_chain_cmd.rs b/client/cli/src/commands/purge_chain_cmd.rs index 9b77906e38..6b540a66a2 100644 --- a/client/cli/src/commands/purge_chain_cmd.rs +++ b/client/cli/src/commands/purge_chain_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/revert_cmd.rs b/client/cli/src/commands/revert_cmd.rs index 03b16578b3..ea6ba5ecf7 100644 --- a/client/cli/src/commands/revert_cmd.rs +++ b/client/cli/src/commands/revert_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/commands/run_cmd.rs b/client/cli/src/commands/run_cmd.rs index ea8bd640a5..c34a31e59b 100644 --- a/client/cli/src/commands/run_cmd.rs +++ b/client/cli/src/commands/run_cmd.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/config.rs b/client/cli/src/config.rs index d309c1e34a..fb0101ec88 100644 --- a/client/cli/src/config.rs +++ b/client/cli/src/config.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/error.rs b/client/cli/src/error.rs index 8839ff79c4..fa336974d6 100644 --- a/client/cli/src/error.rs +++ b/client/cli/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index a9195ab383..271572b43d 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/database_params.rs b/client/cli/src/params/database_params.rs index 76e38e424d..62b0436788 100644 --- a/client/cli/src/params/database_params.rs +++ b/client/cli/src/params/database_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/import_params.rs b/client/cli/src/params/import_params.rs index 5602f098d8..e1c86aec9b 100644 --- a/client/cli/src/params/import_params.rs +++ b/client/cli/src/params/import_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/keystore_params.rs b/client/cli/src/params/keystore_params.rs index aa9ddeef49..4dbd793456 100644 --- a/client/cli/src/params/keystore_params.rs +++ b/client/cli/src/params/keystore_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/mod.rs b/client/cli/src/params/mod.rs index 152fe4c93c..3a66e5f055 100644 --- a/client/cli/src/params/mod.rs +++ b/client/cli/src/params/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/network_params.rs b/client/cli/src/params/network_params.rs index 6f5aea15d3..cd64783ec9 100644 --- a/client/cli/src/params/network_params.rs +++ b/client/cli/src/params/network_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/node_key_params.rs b/client/cli/src/params/node_key_params.rs index 34d5d618fb..ede9fd02e1 100644 --- a/client/cli/src/params/node_key_params.rs +++ b/client/cli/src/params/node_key_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/offchain_worker_params.rs b/client/cli/src/params/offchain_worker_params.rs index 87f6e23752..ca99ab506e 100644 --- a/client/cli/src/params/offchain_worker_params.rs +++ b/client/cli/src/params/offchain_worker_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/pruning_params.rs b/client/cli/src/params/pruning_params.rs index aa86d939e6..d96a44986d 100644 --- a/client/cli/src/params/pruning_params.rs +++ b/client/cli/src/params/pruning_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/shared_params.rs b/client/cli/src/params/shared_params.rs index d29bd104ad..94fb3ceea6 100644 --- a/client/cli/src/params/shared_params.rs +++ b/client/cli/src/params/shared_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/params/transaction_pool_params.rs b/client/cli/src/params/transaction_pool_params.rs index d5205b5c9f..00f5f0dbd6 100644 --- a/client/cli/src/params/transaction_pool_params.rs +++ b/client/cli/src/params/transaction_pool_params.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/cli/src/runner.rs b/client/cli/src/runner.rs index 042e21e441..1600aed7d6 100644 --- a/client/cli/src/runner.rs +++ b/client/cli/src/runner.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/consensus/aura/src/digests.rs b/client/consensus/aura/src/digests.rs index b415560e76..8ddcb2bee4 100644 --- a/client/consensus/aura/src/digests.rs +++ b/client/consensus/aura/src/digests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index ae88c1707b..06aa7db400 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index 395fa8dc4f..0c8a16e4da 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/consensus/manual-seal/src/error.rs b/client/consensus/manual-seal/src/error.rs index 343e50b291..36499893c3 100644 --- a/client/consensus/manual-seal/src/error.rs +++ b/client/consensus/manual-seal/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index 6354e43ed3..754203f7ba 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index 846377b7bc..b0d1e04348 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/bench.rs b/client/db/src/bench.rs index 2d815bdeba..3b31a37b14 100644 --- a/client/db/src/bench.rs +++ b/client/db/src/bench.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/cache/list_cache.rs b/client/db/src/cache/list_cache.rs index c1d71cfb5d..a2af053e87 100644 --- a/client/db/src/cache/list_cache.rs +++ b/client/db/src/cache/list_cache.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, @@ -1765,7 +1765,7 @@ pub mod tests { Some(Entry { valid_from: test_id(20), value: 20 }), vec![5, 6].into_iter().collect(), ))); - + assert_eq!( ops.operations, vec![CommitOperation::BlockFinalized( diff --git a/client/db/src/cache/list_entry.rs b/client/db/src/cache/list_entry.rs index 744cb226c8..39dee59d55 100644 --- a/client/db/src/cache/list_entry.rs +++ b/client/db/src/cache/list_entry.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/cache/list_storage.rs b/client/db/src/cache/list_storage.rs index 21917e6eb9..1fa26552e9 100644 --- a/client/db/src/cache/list_storage.rs +++ b/client/db/src/cache/list_storage.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/cache/mod.rs b/client/db/src/cache/mod.rs index a6cb93c6ce..03cda1b589 100644 --- a/client/db/src/cache/mod.rs +++ b/client/db/src/cache/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index cbc637cf84..75d36dde5c 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 56c06ff406..8607823462 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/offchain.rs b/client/db/src/offchain.rs index 8cd94a1594..a7cc1345d1 100644 --- a/client/db/src/offchain.rs +++ b/client/db/src/offchain.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/parity_db.rs b/client/db/src/parity_db.rs index 1c8280e730..ea25aaa9f8 100644 --- a/client/db/src/parity_db.rs +++ b/client/db/src/parity_db.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/stats.rs b/client/db/src/stats.rs index cb9c64c850..7a265ddf82 100644 --- a/client/db/src/stats.rs +++ b/client/db/src/stats.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/subdb.rs b/client/db/src/subdb.rs index 683c33dedd..2f72632b04 100644 --- a/client/db/src/subdb.rs +++ b/client/db/src/subdb.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index 64734ff7d2..c05a411258 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/common/src/error.rs b/client/executor/common/src/error.rs index e2f482f233..8fc0c4392c 100644 --- a/client/executor/common/src/error.rs +++ b/client/executor/common/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index 3500bf8575..d897ef583c 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/common/src/util.rs b/client/executor/common/src/util.rs index 4734e8d6fd..ebd14a5a6e 100644 --- a/client/executor/common/src/util.rs +++ b/client/executor/common/src/util.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 7ec0d22c6d..07add57bb3 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/src/integration_tests/sandbox.rs b/client/executor/src/integration_tests/sandbox.rs index 35ece0a701..8fe7678955 100644 --- a/client/executor/src/integration_tests/sandbox.rs +++ b/client/executor/src/integration_tests/sandbox.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index 2630282b80..a8b86da714 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/src/native_executor.rs b/client/executor/src/native_executor.rs index 61014bab3c..95f5dff8c6 100644 --- a/client/executor/src/native_executor.rs +++ b/client/executor/src/native_executor.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/wasmtime/src/imports.rs b/client/executor/wasmtime/src/imports.rs index 1fc570c200..b427606c3c 100644 --- a/client/executor/wasmtime/src/imports.rs +++ b/client/executor/wasmtime/src/imports.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/wasmtime/src/instance_wrapper.rs b/client/executor/wasmtime/src/instance_wrapper.rs index 006eb5eb20..8b0b5cf382 100644 --- a/client/executor/wasmtime/src/instance_wrapper.rs +++ b/client/executor/wasmtime/src/instance_wrapper.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs index 8dceca70a6..db2cc28e68 100644 --- a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs +++ b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/executor/wasmtime/src/state_holder.rs b/client/executor/wasmtime/src/state_holder.rs index e44bfad122..ac5b64c774 100644 --- a/client/executor/wasmtime/src/state_holder.rs +++ b/client/executor/wasmtime/src/state_holder.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/rpc/src/error.rs b/client/finality-grandpa/rpc/src/error.rs index eab319d3a7..73c36f23f5 100644 --- a/client/finality-grandpa/rpc/src/error.rs +++ b/client/finality-grandpa/rpc/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/rpc/src/lib.rs b/client/finality-grandpa/rpc/src/lib.rs index c146aaf10c..6d8e10622b 100644 --- a/client/finality-grandpa/rpc/src/lib.rs +++ b/client/finality-grandpa/rpc/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/rpc/src/report.rs b/client/finality-grandpa/rpc/src/report.rs index d8667f5609..19b89c5083 100644 --- a/client/finality-grandpa/rpc/src/report.rs +++ b/client/finality-grandpa/rpc/src/report.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/authorities.rs b/client/finality-grandpa/src/authorities.rs index a897ac0209..2105d9ed38 100644 --- a/client/finality-grandpa/src/authorities.rs +++ b/client/finality-grandpa/src/authorities.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 1bef06572b..533acb8de6 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index b8996df9d4..85816b110b 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/finality_proof.rs b/client/finality-grandpa/src/finality_proof.rs index d50418128b..82a5220d87 100644 --- a/client/finality-grandpa/src/finality_proof.rs +++ b/client/finality-grandpa/src/finality_proof.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index 7118492492..3f3bcc0d8c 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index 595435e4e3..7f86f7e443 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index 3cd5c5791e..ab73abc3de 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index cab2b894ec..ee203a225d 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index dd746edb42..dbc54a0d64 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index ab182004a9..6be1a1b1be 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/finality-grandpa/src/voting_rule.rs b/client/finality-grandpa/src/voting_rule.rs index 9e234328a3..d0c47037ab 100644 --- a/client/finality-grandpa/src/voting_rule.rs +++ b/client/finality-grandpa/src/voting_rule.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/informant/src/lib.rs b/client/informant/src/lib.rs index 3f4724824d..891e9c0211 100644 --- a/client/informant/src/lib.rs +++ b/client/informant/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network-gossip/src/state_machine.rs b/client/network-gossip/src/state_machine.rs index 693e14f813..0d8ad50970 100644 --- a/client/network-gossip/src/state_machine.rs +++ b/client/network-gossip/src/state_machine.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network-gossip/src/validator.rs b/client/network-gossip/src/validator.rs index 2fb9282c48..cd0a733c91 100644 --- a/client/network-gossip/src/validator.rs +++ b/client/network-gossip/src/validator.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/chain.rs b/client/network/src/chain.rs index e3deda0dc9..f79cf6f61e 100644 --- a/client/network/src/chain.rs +++ b/client/network/src/chain.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/config.rs b/client/network/src/config.rs index f03b2169e9..c1534c6d9c 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/error.rs b/client/network/src/error.rs index 270c0e7b8d..e46273c47b 100644 --- a/client/network/src/error.rs +++ b/client/network/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/lib.rs b/client/network/src/lib.rs index 8174666ab7..7cc5e85371 100644 --- a/client/network/src/lib.rs +++ b/client/network/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/network_state.rs b/client/network/src/network_state.rs index d8920951bc..ca6733de81 100644 --- a/client/network/src/network_state.rs +++ b/client/network/src/network_state.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index 8cf7717407..c76ebb0351 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 4153129a0a..a245659ee0 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/generic_proto/handler.rs b/client/network/src/protocol/generic_proto/handler.rs index a013b933c2..3b4469a872 100644 --- a/client/network/src/protocol/generic_proto/handler.rs +++ b/client/network/src/protocol/generic_proto/handler.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/generic_proto/handler/notif_in.rs b/client/network/src/protocol/generic_proto/handler/notif_in.rs index a979b8f9cd..68708b9fb7 100644 --- a/client/network/src/protocol/generic_proto/handler/notif_in.rs +++ b/client/network/src/protocol/generic_proto/handler/notif_in.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/generic_proto/upgrade.rs b/client/network/src/protocol/generic_proto/upgrade.rs index 7172451cee..6322a10b57 100644 --- a/client/network/src/protocol/generic_proto/upgrade.rs +++ b/client/network/src/protocol/generic_proto/upgrade.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/generic_proto/upgrade/legacy.rs b/client/network/src/protocol/generic_proto/upgrade/legacy.rs index 15e34197d4..aba7fda2c3 100644 --- a/client/network/src/protocol/generic_proto/upgrade/legacy.rs +++ b/client/network/src/protocol/generic_proto/upgrade/legacy.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/message.rs b/client/network/src/protocol/message.rs index 155e945f4e..5baa8ed78f 100644 --- a/client/network/src/protocol/message.rs +++ b/client/network/src/protocol/message.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/sync/blocks.rs b/client/network/src/protocol/sync/blocks.rs index c79c0d7f51..8d7e375d08 100644 --- a/client/network/src/protocol/sync/blocks.rs +++ b/client/network/src/protocol/sync/blocks.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index 1e63749c25..5df77a8228 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/schema.rs b/client/network/src/schema.rs index dbc85dd97b..c736b5c652 100644 --- a/client/network/src/schema.rs +++ b/client/network/src/schema.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 5448568930..132f6be749 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/service/out_events.rs b/client/network/src/service/out_events.rs index 08c0968cf9..024b974266 100644 --- a/client/network/src/service/out_events.rs +++ b/client/network/src/service/out_events.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/service/tests.rs b/client/network/src/service/tests.rs index eada49d741..cd1ac85497 100644 --- a/client/network/src/service/tests.rs +++ b/client/network/src/service/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 5dca5ff43b..c241d25034 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/test/src/block_import.rs b/client/network/test/src/block_import.rs index 4e66ff879f..34199abde2 100644 --- a/client/network/test/src/block_import.rs +++ b/client/network/test/src/block_import.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/test/src/lib.rs b/client/network/test/src/lib.rs index 25a7f3a606..3ce28c261f 100644 --- a/client/network/test/src/lib.rs +++ b/client/network/test/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index 50051540d2..a87badead7 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/peerset/src/lib.rs b/client/peerset/src/lib.rs index 6a6f3d0905..bde3bf628c 100644 --- a/client/peerset/src/lib.rs +++ b/client/peerset/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/peerset/tests/fuzz.rs b/client/peerset/tests/fuzz.rs index 12e20a04be..dbc688fd5e 100644 --- a/client/peerset/tests/fuzz.rs +++ b/client/peerset/tests/fuzz.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/author/error.rs b/client/rpc-api/src/author/error.rs index 0b7d02a914..192d0c2795 100644 --- a/client/rpc-api/src/author/error.rs +++ b/client/rpc-api/src/author/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/author/mod.rs b/client/rpc-api/src/author/mod.rs index aa3ec9bf5c..d99f854037 100644 --- a/client/rpc-api/src/author/mod.rs +++ b/client/rpc-api/src/author/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/chain/error.rs b/client/rpc-api/src/chain/error.rs index 6b3dd6341a..fd7bd0a43d 100644 --- a/client/rpc-api/src/chain/error.rs +++ b/client/rpc-api/src/chain/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/chain/mod.rs b/client/rpc-api/src/chain/mod.rs index 13afa3ffc6..0d394acd0b 100644 --- a/client/rpc-api/src/chain/mod.rs +++ b/client/rpc-api/src/chain/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/child_state/mod.rs b/client/rpc-api/src/child_state/mod.rs index 8d0d0049af..21045677f4 100644 --- a/client/rpc-api/src/child_state/mod.rs +++ b/client/rpc-api/src/child_state/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/errors.rs b/client/rpc-api/src/errors.rs index 96bbadc27d..a0c9c4cfbe 100644 --- a/client/rpc-api/src/errors.rs +++ b/client/rpc-api/src/errors.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/helpers.rs b/client/rpc-api/src/helpers.rs index 5eaa8d8d8f..5ce9161ad5 100644 --- a/client/rpc-api/src/helpers.rs +++ b/client/rpc-api/src/helpers.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/offchain/error.rs b/client/rpc-api/src/offchain/error.rs index bfdd663121..6e9b531623 100644 --- a/client/rpc-api/src/offchain/error.rs +++ b/client/rpc-api/src/offchain/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/offchain/mod.rs b/client/rpc-api/src/offchain/mod.rs index 9c60cf65b2..c456e56a4d 100644 --- a/client/rpc-api/src/offchain/mod.rs +++ b/client/rpc-api/src/offchain/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/policy.rs b/client/rpc-api/src/policy.rs index 74c2d0594b..3dc3bf8505 100644 --- a/client/rpc-api/src/policy.rs +++ b/client/rpc-api/src/policy.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/state/error.rs b/client/rpc-api/src/state/error.rs index a33bbd3df4..2dabe309ee 100644 --- a/client/rpc-api/src/state/error.rs +++ b/client/rpc-api/src/state/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/state/helpers.rs b/client/rpc-api/src/state/helpers.rs index af414a0498..b740a8e33b 100644 --- a/client/rpc-api/src/state/helpers.rs +++ b/client/rpc-api/src/state/helpers.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/state/mod.rs b/client/rpc-api/src/state/mod.rs index a31ef598c8..cec32a26c6 100644 --- a/client/rpc-api/src/state/mod.rs +++ b/client/rpc-api/src/state/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/subscriptions.rs b/client/rpc-api/src/subscriptions.rs index db5d178450..772e9d4ee8 100644 --- a/client/rpc-api/src/subscriptions.rs +++ b/client/rpc-api/src/subscriptions.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/system/error.rs b/client/rpc-api/src/system/error.rs index a4b7a1ca54..bd75b86493 100644 --- a/client/rpc-api/src/system/error.rs +++ b/client/rpc-api/src/system/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/system/helpers.rs b/client/rpc-api/src/system/helpers.rs index 0b29011f21..fbc68de05a 100644 --- a/client/rpc-api/src/system/helpers.rs +++ b/client/rpc-api/src/system/helpers.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-api/src/system/mod.rs b/client/rpc-api/src/system/mod.rs index 769a914ecb..6a2026c978 100644 --- a/client/rpc-api/src/system/mod.rs +++ b/client/rpc-api/src/system/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index cd1b33ad8b..3366343213 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index 297fe2794b..fc23db95a8 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index 2f944afc8f..a9caa6d91a 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/chain/mod.rs b/client/rpc/src/chain/mod.rs index 23e43e57fb..8341724227 100644 --- a/client/rpc/src/chain/mod.rs +++ b/client/rpc/src/chain/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/chain/tests.rs b/client/rpc/src/chain/tests.rs index 3c8ee5c817..477438e286 100644 --- a/client/rpc/src/chain/tests.rs +++ b/client/rpc/src/chain/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index defb7257a5..0ec44b5663 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/metadata.rs b/client/rpc/src/metadata.rs index cf795197f5..3c2902694e 100644 --- a/client/rpc/src/metadata.rs +++ b/client/rpc/src/metadata.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/offchain/mod.rs b/client/rpc/src/offchain/mod.rs index 4ec11bfeb5..f55148b451 100644 --- a/client/rpc/src/offchain/mod.rs +++ b/client/rpc/src/offchain/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/offchain/tests.rs b/client/rpc/src/offchain/tests.rs index 8fa23715f7..f1fa925a35 100644 --- a/client/rpc/src/offchain/tests.rs +++ b/client/rpc/src/offchain/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index 395da68a10..e4d6918afb 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index 85a12e11f9..a275624053 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/system/mod.rs b/client/rpc/src/system/mod.rs index b73a924c41..92a5f61c89 100644 --- a/client/rpc/src/system/mod.rs +++ b/client/rpc/src/system/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/system/tests.rs b/client/rpc/src/system/tests.rs index 826e85f277..e79e85f771 100644 --- a/client/rpc/src/system/tests.rs +++ b/client/rpc/src/system/tests.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/rpc/src/testing.rs b/client/rpc/src/testing.rs index 48f9f90b9d..afca07a7fb 100644 --- a/client/rpc/src/testing.rs +++ b/client/rpc/src/testing.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 1bbf065825..81a861d621 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 7206ab6b3a..f02161fc72 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/block_rules.rs b/client/service/src/client/block_rules.rs index 8ea9c42483..0d7e8effc6 100644 --- a/client/service/src/client/block_rules.rs +++ b/client/service/src/client/block_rules.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/call_executor.rs b/client/service/src/client/call_executor.rs index 093d74e3b3..d0304914ff 100644 --- a/client/service/src/client/call_executor.rs +++ b/client/service/src/client/call_executor.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/client.rs b/client/service/src/client/client.rs index 09b9929a32..9db7b714e1 100644 --- a/client/service/src/client/client.rs +++ b/client/service/src/client/client.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/genesis.rs b/client/service/src/client/genesis.rs index 66436ce81f..9f68e20950 100644 --- a/client/service/src/client/genesis.rs +++ b/client/service/src/client/genesis.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/light/backend.rs b/client/service/src/client/light/backend.rs index 7ba60567ab..d336127131 100644 --- a/client/service/src/client/light/backend.rs +++ b/client/service/src/client/light/backend.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/light/blockchain.rs b/client/service/src/client/light/blockchain.rs index 02212a0263..6076b386dc 100644 --- a/client/service/src/client/light/blockchain.rs +++ b/client/service/src/client/light/blockchain.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/light/call_executor.rs b/client/service/src/client/light/call_executor.rs index 76551f2bfd..0f6a8f1372 100644 --- a/client/service/src/client/light/call_executor.rs +++ b/client/service/src/client/light/call_executor.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/light/fetcher.rs b/client/service/src/client/light/fetcher.rs index e3b82bd2b2..b62225c59c 100644 --- a/client/service/src/client/light/fetcher.rs +++ b/client/service/src/client/light/fetcher.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/light/mod.rs b/client/service/src/client/light/mod.rs index 7cc13cfb6b..32288d7b8b 100644 --- a/client/service/src/client/light/mod.rs +++ b/client/service/src/client/light/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/client/mod.rs b/client/service/src/client/mod.rs index 996b885fe5..52a67eb3e3 100644 --- a/client/service/src/client/mod.rs +++ b/client/service/src/client/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 0cc43dac48..7e4949e534 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/error.rs b/client/service/src/error.rs index 0b2bbd8d56..244fa553ff 100644 --- a/client/service/src/error.rs +++ b/client/service/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 5604b98e82..feae664301 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/src/metrics.rs b/client/service/src/metrics.rs index d1dd1a3bab..040dc8eb62 100644 --- a/client/service/src/metrics.rs +++ b/client/service/src/metrics.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/test/src/client/db.rs b/client/service/test/src/client/db.rs index 134075a11d..19cf62b30d 100644 --- a/client/service/test/src/client/db.rs +++ b/client/service/test/src/client/db.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/test/src/client/light.rs b/client/service/test/src/client/light.rs index 0ad5ba78fb..ec319e4832 100644 --- a/client/service/test/src/client/light.rs +++ b/client/service/test/src/client/light.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/test/src/client/mod.rs b/client/service/test/src/client/mod.rs index 0791c421bd..1cfbe2930d 100644 --- a/client/service/test/src/client/mod.rs +++ b/client/service/test/src/client/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index faffce3e0a..a7e4b31ebb 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/state-db/src/lib.rs b/client/state-db/src/lib.rs index 6025501102..68c658beb6 100644 --- a/client/state-db/src/lib.rs +++ b/client/state-db/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/state-db/src/noncanonical.rs b/client/state-db/src/noncanonical.rs index e9b4c829e1..34e7a8725c 100644 --- a/client/state-db/src/noncanonical.rs +++ b/client/state-db/src/noncanonical.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/state-db/src/pruning.rs b/client/state-db/src/pruning.rs index 3ab4a61da4..743db9bc1f 100644 --- a/client/state-db/src/pruning.rs +++ b/client/state-db/src/pruning.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/state-db/src/test.rs b/client/state-db/src/test.rs index d445ce6b6d..17686031a7 100644 --- a/client/state-db/src/test.rs +++ b/client/state-db/src/test.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/telemetry/src/lib.rs b/client/telemetry/src/lib.rs index b959697f39..0752a3c53f 100644 --- a/client/telemetry/src/lib.rs +++ b/client/telemetry/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/telemetry/src/worker.rs b/client/telemetry/src/worker.rs index 04689f7686..b147313aee 100644 --- a/client/telemetry/src/worker.rs +++ b/client/telemetry/src/worker.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/telemetry/src/worker/node.rs b/client/telemetry/src/worker/node.rs index 0662ecab54..bdca054c23 100644 --- a/client/telemetry/src/worker/node.rs +++ b/client/telemetry/src/worker/node.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/benches/basics.rs b/client/transaction-pool/graph/benches/basics.rs index 544d31e176..80d5ac838b 100644 --- a/client/transaction-pool/graph/benches/basics.rs +++ b/client/transaction-pool/graph/benches/basics.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 452f9c9feb..2cb9a16126 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/error.rs b/client/transaction-pool/graph/src/error.rs index c04f90dac0..b970ab6f45 100644 --- a/client/transaction-pool/graph/src/error.rs +++ b/client/transaction-pool/graph/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index beff5bb2cc..76fa51a3ad 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/lib.rs b/client/transaction-pool/graph/src/lib.rs index 632f7d3feb..6ef80e2eb2 100644 --- a/client/transaction-pool/graph/src/lib.rs +++ b/client/transaction-pool/graph/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/listener.rs b/client/transaction-pool/graph/src/listener.rs index c8bf2c9d39..0bee4384c2 100644 --- a/client/transaction-pool/graph/src/listener.rs +++ b/client/transaction-pool/graph/src/listener.rs @@ -6,7 +6,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index cef2f0b62e..ffcdcdc06f 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/ready.rs b/client/transaction-pool/graph/src/ready.rs index e759e318a1..dcd55f980f 100644 --- a/client/transaction-pool/graph/src/ready.rs +++ b/client/transaction-pool/graph/src/ready.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/rotator.rs b/client/transaction-pool/graph/src/rotator.rs index 9ce6a43b1e..a6bb855f23 100644 --- a/client/transaction-pool/graph/src/rotator.rs +++ b/client/transaction-pool/graph/src/rotator.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 4a32c4c58c..66047ad50d 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/graph/src/watcher.rs b/client/transaction-pool/graph/src/watcher.rs index 098e468d22..1c03c0e6a8 100644 --- a/client/transaction-pool/graph/src/watcher.rs +++ b/client/transaction-pool/graph/src/watcher.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index 90d667d613..f2cd9c707f 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/error.rs b/client/transaction-pool/src/error.rs index feccf4a7b0..fa05ca6a64 100644 --- a/client/transaction-pool/src/error.rs +++ b/client/transaction-pool/src/error.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 62b99ef505..8976003b7d 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/metrics.rs b/client/transaction-pool/src/metrics.rs index 3b0e48cbfc..68c5042f2d 100644 --- a/client/transaction-pool/src/metrics.rs +++ b/client/transaction-pool/src/metrics.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/revalidation.rs b/client/transaction-pool/src/revalidation.rs index f8f7280417..261ef5a140 100644 --- a/client/transaction-pool/src/revalidation.rs +++ b/client/transaction-pool/src/revalidation.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/testing/mod.rs b/client/transaction-pool/src/testing/mod.rs index c4bf184a2b..c22d61491a 100644 --- a/client/transaction-pool/src/testing/mod.rs +++ b/client/transaction-pool/src/testing/mod.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, diff --git a/client/transaction-pool/src/testing/pool.rs b/client/transaction-pool/src/testing/pool.rs index 32701d3c2d..0b5ce8e90d 100644 --- a/client/transaction-pool/src/testing/pool.rs +++ b/client/transaction-pool/src/testing/pool.rs @@ -5,7 +5,7 @@ // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or +// the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, -- GitLab From 4d85a52abde659f83d32db8bf1cf76239f9f203b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Mon, 18 May 2020 12:53:33 +0100 Subject: [PATCH 068/150] grandpa: minor cleanup for gossip round start instant (#5976) * grandpa: move gossip round start instant to LocalView * grandpa: round duration is 2 gossip periods --- .../src/communication/gossip.rs | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/client/finality-grandpa/src/communication/gossip.rs b/client/finality-grandpa/src/communication/gossip.rs index 7fe17e974b..c96301ede8 100644 --- a/client/finality-grandpa/src/communication/gossip.rs +++ b/client/finality-grandpa/src/communication/gossip.rs @@ -110,7 +110,7 @@ const CATCH_UP_THRESHOLD: u64 = 2; const PROPAGATION_ALL: u32 = 4; //in rounds; const PROPAGATION_ALL_AUTHORITIES: u32 = 2; //in rounds; const PROPAGATION_SOME_NON_AUTHORITIES: u32 = 3; //in rounds; -const ROUND_DURATION: u32 = 4; // measured in gossip durations +const ROUND_DURATION: u32 = 2; // measured in gossip durations const MIN_LUCKY: usize = 5; @@ -181,15 +181,27 @@ impl View { } } -/// A local view of protocol state. Only differs from `View` in that we also -/// track the round and set id at which the last commit was observed. +/// A local view of protocol state. Similar to `View` but we additionally track +/// the round and set id at which the last commit was observed, and the instant +/// at which the current round started. struct LocalView { round: Round, set_id: SetId, last_commit: Option<(N, Round, SetId)>, + round_start: Instant, } impl LocalView { + /// Creates a new `LocalView` at the given set id and round. + fn new(set_id: SetId, round: Round) -> LocalView { + LocalView { + set_id, + round, + last_commit: None, + round_start: Instant::now(), + } + } + /// Converts the local view to a `View` discarding round and set id /// information about the last commit. fn as_view(&self) -> View<&N> { @@ -205,9 +217,16 @@ impl LocalView { if set_id != self.set_id { self.set_id = set_id; self.round = Round(1); + self.round_start = Instant::now(); } } + /// Updates the current round. + fn update_round(&mut self, round: Round) { + self.round = round; + self.round_start = Instant::now(); + } + /// Returns the height of the block that the last observed commit finalizes. fn last_commit_height(&self) -> Option<&N> { self.last_commit.as_ref().map(|(number, _, _)| number) @@ -656,7 +675,6 @@ struct Inner { local_view: Option>>, peers: Peers>, live_topics: KeepTopics, - round_start: Instant, authorities: Vec, config: crate::Config, next_rebroadcast: Instant, @@ -689,7 +707,6 @@ impl Inner { local_view: None, peers: Peers::default(), live_topics: KeepTopics::new(), - round_start: Instant::now(), next_rebroadcast: Instant::now() + REBROADCAST_AFTER, authorities: Vec::new(), pending_catch_up: PendingCatchUp::None, @@ -715,10 +732,9 @@ impl Inner { debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.", self.config.name(), (round, set_id)); - local_view.round = round; + local_view.update_round(round); self.live_topics.push(round, set_id); - self.round_start = Instant::now(); self.peers.reshuffle(); } self.multicast_neighbor_packet() @@ -729,11 +745,10 @@ impl Inner { fn note_set(&mut self, set_id: SetId, authorities: Vec) -> MaybeMessage { { let local_view = match self.local_view { - ref mut x @ None => x.get_or_insert(LocalView { - round: Round(1), + ref mut x @ None => x.get_or_insert(LocalView::new( set_id, - last_commit: None, - }), + Round(1), + )), Some(ref mut v) => if v.set_id == set_id { if self.authorities != authorities { debug!(target: "afg", @@ -1121,8 +1136,10 @@ impl Inner { /// underlying gossip layer, which should happen every 30 seconds. fn round_message_allowed(&self, who: &PeerId, peer: &PeerInfo) -> bool { let round_duration = self.config.gossip_duration * ROUND_DURATION; - let round_elapsed = self.round_start.elapsed(); - + let round_elapsed = match self.local_view { + Some(ref local_view) => local_view.round_start.elapsed(), + None => return false, + }; if !self.config.is_authority && round_elapsed < round_duration * PROPAGATION_ALL @@ -1185,7 +1202,10 @@ impl Inner { /// underlying gossip layer, which should happen every 30 seconds. fn global_message_allowed(&self, who: &PeerId, peer: &PeerInfo) -> bool { let round_duration = self.config.gossip_duration * ROUND_DURATION; - let round_elapsed = self.round_start.elapsed(); + let round_elapsed = match self.local_view { + Some(ref local_view) => local_view.round_start.elapsed(), + None => return false, + }; match peer.roles { ObservedRole::OurSentry | ObservedRole::OurGuardedAuthority => true, @@ -2320,7 +2340,8 @@ mod tests { let test = |num_round, peers| { // rewind n round durations - val.inner.write().round_start = Instant::now() - round_duration * num_round; + val.inner.write().local_view.as_mut().unwrap().round_start = + Instant::now() - round_duration * num_round; let mut message_allowed = val.message_allowed(); move || { @@ -2448,7 +2469,8 @@ mod tests { } { - val.inner.write().round_start = Instant::now() - round_duration * 4; + val.inner.write().local_view.as_mut().unwrap().round_start = + Instant::now() - round_duration * 4; let mut message_allowed = val.message_allowed(); // on the fourth round duration we should allow messages to authorities // (on the second we would do `sqrt(authorities)`) -- GitLab From af463334af10d9c8f09badc6dde3fa5c3eed096f Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 18 May 2020 16:48:44 +0300 Subject: [PATCH 069/150] Add block construction prometheus metrics (#6030) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add basic authorship metrics * fixes * no arc * move to crate * Update client/proposer-metrics/Cargo.toml Co-authored-by: Max Inden * remove prefix * use HistogramTimer * Update client/proposer-metrics/src/lib.rs Co-authored-by: Bastian Köcher * Update client/basic-authorship/src/basic_authorship.rs Co-authored-by: Bastian Köcher * Update client/basic-authorship/src/basic_authorship.rs Co-authored-by: Bastian Köcher * Update client/basic-authorship/src/basic_authorship.rs Co-authored-by: Bastian Köcher * Update client/basic-authorship/src/basic_authorship.rs Co-authored-by: Bastian Köcher * Update client/basic-authorship/src/basic_authorship.rs Co-authored-by: Bastian Köcher * Update client/proposer-metrics/src/lib.rs Co-authored-by: Bastian Köcher * Update client/proposer-metrics/src/lib.rs Co-authored-by: Bastian Köcher Co-authored-by: Max Inden Co-authored-by: Bastian Köcher --- Cargo.lock | 10 +++ Cargo.toml | 1 + bin/node-template/node/src/service.rs | 7 +- bin/node/cli/src/service.rs | 6 +- client/basic-authorship/Cargo.toml | 8 ++- .../basic-authorship/src/basic_authorship.rs | 27 ++++++-- client/basic-authorship/src/lib.rs | 2 +- client/consensus/manual-seal/src/lib.rs | 7 +- client/proposer-metrics/Cargo.toml | 16 +++++ client/proposer-metrics/src/lib.rs | 67 +++++++++++++++++++ primitives/consensus/common/src/lib.rs | 4 +- 11 files changed, 139 insertions(+), 16 deletions(-) create mode 100644 client/proposer-metrics/Cargo.toml create mode 100644 client/proposer-metrics/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 5c50933839..5e23615fdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5885,6 +5885,7 @@ dependencies = [ "parking_lot 0.10.2", "sc-block-builder", "sc-client-api", + "sc-proposer-metrics", "sc-telemetry", "sc-transaction-pool", "sp-api", @@ -5894,6 +5895,7 @@ dependencies = [ "sp-inherents", "sp-runtime", "sp-transaction-pool", + "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tokio-executor 0.2.0-alpha.6", ] @@ -6601,6 +6603,14 @@ dependencies = [ "wasm-timer", ] +[[package]] +name = "sc-proposer-metrics" +version = "0.8.0-dev" +dependencies = [ + "log", + "substrate-prometheus-endpoint", +] + [[package]] name = "sc-rpc" version = "2.0.0-dev" diff --git a/Cargo.toml b/Cargo.toml index d9ee8709d1..8fbe1cf0d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "client/network-gossip", "client/offchain", "client/peerset", + "client/proposer-metrics", "client/rpc-servers", "client/rpc", "client/rpc-api", diff --git a/bin/node-template/node/src/service.rs b/bin/node-template/node/src/service.rs index d02e9ea95e..8e57a04137 100644 --- a/bin/node-template/node/src/service.rs +++ b/bin/node-template/node/src/service.rs @@ -106,8 +106,11 @@ pub fn new_full(config: Configuration) -> Result. + //! A consensus proposer for "basic" chains which use the primitive inherent-data. // FIXME #1021 move this into sp-consensus @@ -38,21 +39,31 @@ use futures::{executor, future, future::Either}; use sp_blockchain::{HeaderBackend, ApplyExtrinsicFailed::Validity, Error::ApplyExtrinsicFailed}; use std::marker::PhantomData; +use prometheus_endpoint::Registry as PrometheusRegistry; +use sc_proposer_metrics::MetricsLink as PrometheusMetrics; + /// Proposer factory. pub struct ProposerFactory { /// The client instance. client: Arc, /// The transaction pool. transaction_pool: Arc, + /// Prometheus Link, + metrics: PrometheusMetrics, /// phantom member to pin the `Backend` type. _phantom: PhantomData, } impl ProposerFactory { - pub fn new(client: Arc, transaction_pool: Arc) -> Self { + pub fn new( + client: Arc, + transaction_pool: Arc, + prometheus: Option<&PrometheusRegistry>, + ) -> Self { ProposerFactory { client, transaction_pool, + metrics: PrometheusMetrics::new(prometheus), _phantom: PhantomData, } } @@ -87,6 +98,7 @@ impl ProposerFactory parent_number: *parent_header.number(), transaction_pool: self.transaction_pool.clone(), now, + metrics: self.metrics.clone(), _phantom: PhantomData, }), }; @@ -131,6 +143,7 @@ struct ProposerInner { parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc, now: Box time::Instant + Send + Sync>, + metrics: PrometheusMetrics, _phantom: PhantomData, } @@ -219,6 +232,7 @@ impl ProposerInner } // proceed with transactions + let block_timer = self.metrics.report(|metrics| metrics.block_constructed.start_timer()); let mut is_first = true; let mut skipped = 0; let mut unqueue_invalid = Vec::new(); @@ -289,6 +303,9 @@ impl ProposerInner let (block, storage_changes, proof) = block_builder.build()?.into_inner(); + drop(block_timer); + self.metrics.report(|metrics| metrics.number_of_transactions.set(block.extrinsics().len() as u64)); + info!("🎁 Prepared block for proposing at {} [hash: {:?}; parent_hash: {}; extrinsics ({}): [{}]]", block.header().number(), ::Hash::from(block.header().hash()), @@ -379,7 +396,7 @@ mod tests { )) ); - let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone()); + let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone(), None); let cell = Mutex::new((false, time::Instant::now())); let mut proposer = proposer_factory.init_with_now( @@ -420,7 +437,7 @@ mod tests { ).0 ); - let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone()); + let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone(), None); let cell = Mutex::new((false, time::Instant::now())); let mut proposer = proposer_factory.init_with_now( @@ -470,7 +487,7 @@ mod tests { )) ); - let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone()); + let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone(), None); let mut proposer = proposer_factory.init_with_now( &client.header(&block_id).unwrap().unwrap(), @@ -536,7 +553,7 @@ mod tests { ]) ).unwrap(); - let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone()); + let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone(), None); let mut propose_block = | client: &TestClient, number, diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index 7f88844d90..7c77dde6b0 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -29,7 +29,7 @@ //! # let client = Arc::new(substrate_test_runtime_client::new()); //! # let txpool = Arc::new(BasicPool::new(Default::default(), Arc::new(FullChainApi::new(client.clone())), None).0); //! // The first step is to create a `ProposerFactory`. -//! let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone()); +//! let mut proposer_factory = ProposerFactory::new(client.clone(), txpool.clone(), None); //! //! // From this factory, we create a `Proposer`. //! let proposer = proposer_factory.init( diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index 754203f7ba..de9711b2a8 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -225,7 +225,8 @@ mod tests { let pool = Arc::new(BasicPool::new(Options::default(), api(), None).0); let env = ProposerFactory::new( client.clone(), - pool.clone() + pool.clone(), + None, ); // this test checks that blocks are created as soon as transactions are imported into the pool. let (sender, receiver) = futures::channel::oneshot::channel(); @@ -289,7 +290,8 @@ mod tests { let pool = Arc::new(BasicPool::new(Options::default(), api(), None).0); let env = ProposerFactory::new( client.clone(), - pool.clone() + pool.clone(), + None, ); // this test checks that blocks are created as soon as an engine command is sent over the stream. let (mut sink, stream) = futures::channel::mpsc::channel(1024); @@ -358,6 +360,7 @@ mod tests { let env = ProposerFactory::new( client.clone(), pool.clone(), + None, ); // this test checks that blocks are created as soon as an engine command is sent over the stream. let (mut sink, stream) = futures::channel::mpsc::channel(1024); diff --git a/client/proposer-metrics/Cargo.toml b/client/proposer-metrics/Cargo.toml new file mode 100644 index 0000000000..9d510027ec --- /dev/null +++ b/client/proposer-metrics/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "sc-proposer-metrics" +version = "0.8.0-dev" +authors = ["Parity Technologies "] +edition = "2018" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +homepage = "https://substrate.dev" +repository = "https://github.com/paritytech/substrate/" +description = "Basic metrics for block production." + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +log = "0.4.8" +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} diff --git a/client/proposer-metrics/src/lib.rs b/client/proposer-metrics/src/lib.rs new file mode 100644 index 0000000000..5cb749f4a2 --- /dev/null +++ b/client/proposer-metrics/src/lib.rs @@ -0,0 +1,67 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Prometheus basic proposer metrics. + +use prometheus_endpoint::{register, PrometheusError, Registry, Histogram, HistogramOpts, Gauge, U64}; + +/// Optional shareable link to basic authorship metrics. +#[derive(Clone, Default)] +pub struct MetricsLink(Option); + +impl MetricsLink { + pub fn new(registry: Option<&Registry>) -> Self { + Self( + registry.and_then(|registry| + Metrics::register(registry) + .map_err(|err| log::warn!("Failed to register proposer prometheus metrics: {}", err)) + .ok() + ) + ) + } + + pub fn report(&self, do_this: impl FnOnce(&Metrics) -> O) -> Option { + Some(do_this(self.0.as_ref()?)) + } +} + +/// Authorship metrics. +#[derive(Clone)] +pub struct Metrics { + pub block_constructed: Histogram, + pub number_of_transactions: Gauge, +} + +impl Metrics { + pub fn register(registry: &Registry) -> Result { + Ok(Self { + block_constructed: register( + Histogram::with_opts(HistogramOpts::new( + "proposer_block_constructed", + "Histogram of time taken to construct new block", + ))?, + registry, + )?, + number_of_transactions: register( + Gauge::new( + "proposer_number_of_transactions", + "Number of transactions included in block", + )?, + registry, + )?, + }) + } +} diff --git a/primitives/consensus/common/src/lib.rs b/primitives/consensus/common/src/lib.rs index 52b034ffdd..fc56b22516 100644 --- a/primitives/consensus/common/src/lib.rs +++ b/primitives/consensus/common/src/lib.rs @@ -72,7 +72,9 @@ pub enum BlockStatus { Unknown, } -/// Environment producer for a Consensus instance. Creates proposer instance and communication streams. +/// Environment for a Consensus instance. +/// +/// Creates proposer instance. pub trait Environment { /// The proposer type this creates. type Proposer: Proposer + Send + 'static; -- GitLab From 05b70542eaf6629f9811e9d8b09bf2baa4ebf884 Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 19 May 2020 00:41:28 +0800 Subject: [PATCH 070/150] chore: updates the license badge (#6058) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 874ec99e69..5bb7ebb775 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Substrate · [![GitHub license](https://img.shields.io/github/license/paritytech/substrate)](LICENSE) [![GitLab Status](https://gitlab.parity.io/parity/substrate/badges/master/pipeline.svg)](https://gitlab.parity.io/parity/substrate/pipelines) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](docs/CONTRIBUTING.adoc) +# Substrate · [![GitHub license](https://img.shields.io/badge/license-GPL3%2FApache2-blue)](LICENSE) [![GitLab Status](https://gitlab.parity.io/parity/substrate/badges/master/pipeline.svg)](https://gitlab.parity.io/parity/substrate/pipelines) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](docs/CONTRIBUTING.adoc)

@@ -21,4 +21,4 @@ The security policy and procedures can be found in [`docs/SECURITY.md`](docs/SEC ## License -Substrate Client (`/client/*` / `sc-*`) is licensed under [GPL v3.0 with a classpath linking exception](LICENSE-GPL3), primitives (`sp-*`), FRAME (`frame-*`) and pallets (`pallets-*`), binaries (`/bin`) and all other utilities are licensed under [Apache 2.0](LICENSE-APACHE2). \ No newline at end of file +Substrate Client (`/client/*` / `sc-*`) is licensed under [GPL v3.0 with a classpath linking exception](LICENSE-GPL3), primitives (`sp-*`), FRAME (`frame-*`) and pallets (`pallets-*`), binaries (`/bin`) and all other utilities are licensed under [Apache 2.0](LICENSE-APACHE2). -- GitLab From c17fce21f88a3f462490cc55bd66b39332c84951 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Mon, 18 May 2020 18:42:25 +0200 Subject: [PATCH 071/150] Fix parallel code execution in wasmtime (#6055) * Bump wasmtime version * Proper test --- Cargo.lock | 16 ++++---- client/executor/src/integration_tests/mod.rs | 40 +++++++++++++------- client/executor/wasmtime/Cargo.toml | 4 +- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e23615fdc..70fb4956d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8289,9 +8289,9 @@ version = "1.0.6" [[package]] name = "substrate-wasmtime" -version = "0.16.0-threadsafe.2" +version = "0.16.0-threadsafe.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40a6f3d5d3c00754e348863fead4f37763c32eedf950f5b23df87769882311" +checksum = "9b0d8eca5d0186e98c8d13399423853e2356b593e028b53e43b2aa35e9105a82" dependencies = [ "anyhow", "backtrace", @@ -8312,9 +8312,9 @@ dependencies = [ [[package]] name = "substrate-wasmtime-jit" -version = "0.16.0-threadsafe.2" +version = "0.16.0-threadsafe.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09712de4f56a2c2912bee7763b0877d17d72cfb2237987d63ab78956907e7692" +checksum = "e95772b1778186e4f5c9ae9148bab9911cddf563805a403dee418780e2ed14b4" dependencies = [ "anyhow", "cfg-if", @@ -8339,9 +8339,9 @@ dependencies = [ [[package]] name = "substrate-wasmtime-profiling" -version = "0.16.0-threadsafe.2" +version = "0.16.0-threadsafe.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31505dd221f001634a54ea51472bc0058bcbde9186eaf8dd31d0859638121385" +checksum = "1f8a0bf9ca20bee7d83338470247a3f1823158382ebd51fadefcc986e0a6c3de" dependencies = [ "anyhow", "cfg-if", @@ -8358,9 +8358,9 @@ dependencies = [ [[package]] name = "substrate-wasmtime-runtime" -version = "0.16.0-threadsafe.2" +version = "0.16.0-threadsafe.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3708081f04d9216d4dee487abf94872065f930cf82e287bd0c5bdb57895460ba" +checksum = "a559895fe1efab16d1c490199225ae35c153ed432ef87ebc177fb37edbd20c7c" dependencies = [ "backtrace", "cc", diff --git a/client/executor/src/integration_tests/mod.rs b/client/executor/src/integration_tests/mod.rs index 07add57bb3..80b123ed4b 100644 --- a/client/executor/src/integration_tests/mod.rs +++ b/client/executor/src/integration_tests/mod.rs @@ -626,19 +626,33 @@ fn heap_is_reset_between_calls(wasm_method: WasmExecutionMethod) { #[test_case(WasmExecutionMethod::Interpreted)] #[cfg_attr(feature = "wasmtime", test_case(WasmExecutionMethod::Compiled))] fn parallel_execution(wasm_method: WasmExecutionMethod) { - let threads: Vec<_> = (0..8).map(|_| std::thread::spawn(move || { - let mut ext = TestExternalities::default(); - let mut ext = ext.ext(); - assert_eq!( - call_in_wasm( - "test_twox_128", - &[0], - wasm_method.clone(), - &mut ext, - ).unwrap(), - hex!("99e9d85137db46ef4bbea33613baafd5").to_vec().encode(), - ); - })).collect(); + let executor = std::sync::Arc::new(crate::WasmExecutor::new( + wasm_method, + Some(1024), + HostFunctions::host_functions(), + 8, + )); + let code_hash = blake2_256(WASM_BINARY).to_vec(); + let threads: Vec<_> = (0..8).map(|_| + { + let executor = executor.clone(); + let code_hash = code_hash.clone(); + std::thread::spawn(move || { + let mut ext = TestExternalities::default(); + let mut ext = ext.ext(); + assert_eq!( + executor.call_in_wasm( + &WASM_BINARY[..], + Some(code_hash.clone()), + "test_twox_128", + &[0], + &mut ext, + sp_core::traits::MissingHostFunctions::Allow, + ).unwrap(), + hex!("99e9d85137db46ef4bbea33613baafd5").to_vec().encode(), + ); + }) + }).collect(); for t in threads.into_iter() { t.join().unwrap(); diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index 8a424dfc2e..f7f236cb6b 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -21,8 +21,8 @@ sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-in sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } -wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.2" } -wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.2" } +wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.3" } +wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.3" } wasmtime-environ = "0.16" cranelift-wasm = "0.63" cranelift-codegen = "0.63" -- GitLab From adb5acbe7e0216a641d55056d4f016af9e8cf0c7 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 18 May 2020 18:42:44 +0200 Subject: [PATCH 072/150] Print an error if we discover our own network identity (#6047) * Add an error if we discover our own network identity * Fix tests --- client/network/src/protocol.rs | 10 +++++++++- .../src/protocol/generic_proto/behaviour.rs | 18 ++++++++++++++++-- .../src/protocol/generic_proto/tests.rs | 3 ++- client/network/src/service.rs | 1 + 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index a245659ee0..421035e570 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -363,6 +363,7 @@ impl Protocol { /// Create a new instance. pub fn new( config: ProtocolConfig, + local_peer_id: PeerId, chain: Arc>, transaction_pool: Arc>, finality_proof_provider: Option>>, @@ -396,7 +397,13 @@ impl Protocol { let (peerset, peerset_handle) = sc_peerset::Peerset::from_config(peerset_config); let versions = &((MIN_VERSION as u8)..=(CURRENT_VERSION as u8)).collect::>(); - let mut behaviour = GenericProto::new(protocol_id.clone(), versions, peerset, queue_size_report); + let mut behaviour = GenericProto::new( + local_peer_id, + protocol_id.clone(), + versions, + peerset, + queue_size_report + ); let mut legacy_equiv_by_name = HashMap::new(); @@ -2193,6 +2200,7 @@ mod tests { let (mut protocol, _) = Protocol::::new( ProtocolConfig::default(), + PeerId::random(), client.clone(), Arc::new(EmptyTransactionPool), None, diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 4984c0d86d..32cf417ec4 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -109,6 +109,9 @@ use wasm_timer::Instant; /// tries to connect, the connection is accepted. A ban only delays dialing attempts. /// pub struct GenericProto { + /// `PeerId` of the local node. + local_peer_id: PeerId, + /// Legacy protocol to open with peers. Never modified. legacy_protocol: RegisteredProtocol, @@ -321,6 +324,7 @@ impl GenericProto { /// The `queue_size_report` is an optional Prometheus metric that can report the size of the /// messages queue. If passed, it must have one label for the protocol name. pub fn new( + local_peer_id: PeerId, protocol: impl Into, versions: &[u8], peerset: sc_peerset::Peerset, @@ -329,6 +333,7 @@ impl GenericProto { let legacy_protocol = RegisteredProtocol::new(protocol, versions); GenericProto { + local_peer_id, legacy_protocol, notif_protocols: Vec::new(), peerset, @@ -507,9 +512,18 @@ impl GenericProto { /// /// Can be called multiple times with the same `PeerId`s. pub fn add_discovered_nodes(&mut self, peer_ids: impl Iterator) { - self.peerset.discovered(peer_ids.map(|peer_id| { + let local_peer_id = &self.local_peer_id; + self.peerset.discovered(peer_ids.filter_map(|peer_id| { + if peer_id == *local_peer_id { + error!( + target: "sub-libp2p", + "Discovered our own identity. This is a minor inconsequential bug." + ); + return None; + } + debug!(target: "sub-libp2p", "PSM <= Discovered({:?})", peer_id); - peer_id + Some(peer_id) })); } diff --git a/client/network/src/protocol/generic_proto/tests.rs b/client/network/src/protocol/generic_proto/tests.rs index 1bc6e745f8..de02ac5f34 100644 --- a/client/network/src/protocol/generic_proto/tests.rs +++ b/client/network/src/protocol/generic_proto/tests.rs @@ -42,6 +42,7 @@ fn build_nodes() -> (Swarm, Swarm) { for index in 0 .. 2 { let keypair = keypairs[index].clone(); + let local_peer_id = keypair.public().into_peer_id(); let transport = libp2p::core::transport::MemoryTransport .and_then(move |out, endpoint| { let secio = libp2p::secio::SecioConfig::new(keypair); @@ -82,7 +83,7 @@ fn build_nodes() -> (Swarm, Swarm) { }); let behaviour = CustomProtoWithAddr { - inner: GenericProto::new(&b"test"[..], &[1], peerset, None), + inner: GenericProto::new(local_peer_id, &b"test"[..], &[1], peerset, None), addrs: addrs .iter() .enumerate() diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 132f6be749..4b05c26335 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -204,6 +204,7 @@ impl NetworkWorker { roles: From::from(¶ms.role), max_parallel_downloads: params.network_config.max_parallel_downloads, }, + local_peer_id.clone(), params.chain.clone(), params.transaction_pool, params.finality_proof_provider.clone(), -- GitLab From 9bb5cbcc00bf1a1807d38ae93e3a7a54086cab03 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Mon, 18 May 2020 18:42:56 +0200 Subject: [PATCH 073/150] Refactor EVM operations to module functions (#6056) * Refactor EVM operations to module functions * Bump impl version --- bin/node/runtime/src/lib.rs | 2 +- frame/evm/src/lib.rs | 129 ++++++++++++++++++++++++++---------- 2 files changed, 96 insertions(+), 35 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index a7974d9d71..7d877676c0 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -94,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 248, - impl_version: 1, + impl_version: 2, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index 1c38e22917..a2354c7761 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -256,19 +256,14 @@ decl_module! { let sender = ensure_signed(origin)?; let source = T::ConvertAccountId::convert_account_id(&sender); - Self::execute_evm( + Self::execute_call( source, + target, + input, value, gas_limit, gas_price, nonce, - |executor| ((), executor.transact_call( - source, - target, - value, - input, - gas_limit as usize, - )), ).map_err(Into::into) } @@ -291,22 +286,13 @@ decl_module! { let sender = ensure_signed(origin)?; let source = T::ConvertAccountId::convert_account_id(&sender); - let create_address = Self::execute_evm( + let create_address = Self::execute_create( source, + init, value, gas_limit, gas_price, - nonce, - |executor| { - (executor.create_address( - evm::CreateScheme::Legacy { caller: source }, - ), executor.transact_create( - source, - value, - init, - gas_limit as usize, - )) - }, + nonce )?; Module::::deposit_event(Event::::Created(create_address)); @@ -332,24 +318,14 @@ decl_module! { let sender = ensure_signed(origin)?; let source = T::ConvertAccountId::convert_account_id(&sender); - let code_hash = H256::from_slice(Keccak256::digest(&init).as_slice()); - let create_address = Self::execute_evm( + let create_address = Self::execute_create2( source, + init, + salt, value, gas_limit, gas_price, - nonce, - |executor| { - (executor.create_address( - evm::CreateScheme::Create2 { caller: source, code_hash, salt }, - ), executor.transact_create2( - source, - value, - init, - salt, - gas_limit as usize, - )) - }, + nonce )?; Module::::deposit_event(Event::::Created(create_address)); @@ -391,6 +367,91 @@ impl Module { AccountStorages::remove_prefix(address); } + /// Execute a create transaction on behalf of given sender. + pub fn execute_create( + source: H160, + init: Vec, + value: U256, + gas_limit: u32, + gas_price: U256, + nonce: Option + ) -> Result> { + Self::execute_evm( + source, + value, + gas_limit, + gas_price, + nonce, + |executor| { + (executor.create_address( + evm::CreateScheme::Legacy { caller: source }, + ), executor.transact_create( + source, + value, + init, + gas_limit as usize, + )) + }, + ) + } + + /// Execute a create2 transaction on behalf of a given sender. + pub fn execute_create2( + source: H160, + init: Vec, + salt: H256, + value: U256, + gas_limit: u32, + gas_price: U256, + nonce: Option + ) -> Result> { + let code_hash = H256::from_slice(Keccak256::digest(&init).as_slice()); + Self::execute_evm( + source, + value, + gas_limit, + gas_price, + nonce, + |executor| { + (executor.create_address( + evm::CreateScheme::Create2 { caller: source, code_hash, salt }, + ), executor.transact_create2( + source, + value, + init, + salt, + gas_limit as usize, + )) + }, + ) + } + + /// Execute a call transaction on behalf of a given sender. + pub fn execute_call( + source: H160, + target: H160, + input: Vec, + value: U256, + gas_limit: u32, + gas_price: U256, + nonce: Option, + ) -> Result<(), Error> { + Self::execute_evm( + source, + value, + gas_limit, + gas_price, + nonce, + |executor| ((), executor.transact_call( + source, + target, + value, + input, + gas_limit as usize, + )), + ) + } + /// Execute an EVM operation. fn execute_evm( source: H160, -- GitLab From f6afe5b9af3d63d53ef53de23e052672d833aa30 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Mon, 18 May 2020 18:43:18 +0200 Subject: [PATCH 074/150] Make decl_storage generated code respect clippy (#6065) * fix clippy for code generated by decl_storage * use as_ref --- .../src/storage/genesis_config/builder_def.rs | 10 ++++++++-- .../procedural/src/storage/storage_struct.rs | 15 +++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/frame/support/procedural/src/storage/genesis_config/builder_def.rs b/frame/support/procedural/src/storage/genesis_config/builder_def.rs index d134108af9..a045794529 100644 --- a/frame/support/procedural/src/storage/genesis_config/builder_def.rs +++ b/frame/support/procedural/src/storage/genesis_config/builder_def.rs @@ -55,10 +55,16 @@ impl BuilderDef { data = Some(match &line.storage_type { StorageLineTypeDef::Simple(_) if line.is_option => quote_spanned!(builder.span() => - let data = (#builder)(self); + // NOTE: the type of `data` is specified when used later in the code + let builder: fn(&Self) -> _ = #builder; + let data = builder(self); let data = Option::as_ref(&data); ), - _ => quote_spanned!(builder.span() => let data = &(#builder)(self); ), + _ => quote_spanned!(builder.span() => + // NOTE: the type of `data` is specified when used later in the code + let builder: fn(&Self) -> _ = #builder; + let data = &builder(self); + ), }); } else if let Some(config) = &line.config { is_generic |= line.is_generic; diff --git a/frame/support/procedural/src/storage/storage_struct.rs b/frame/support/procedural/src/storage/storage_struct.rs index 6052dbfd4a..4cacb35c49 100644 --- a/frame/support/procedural/src/storage/storage_struct.rs +++ b/frame/support/procedural/src/storage/storage_struct.rs @@ -86,7 +86,10 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre Ident::new(INHERENT_INSTANCE_NAME, Span::call_site()) }; - let storage_name_str = syn::LitStr::new(&line.name.to_string(), line.name.span()); + let storage_name_bstr = syn::LitByteStr::new( + line.name.to_string().as_ref(), + line.name.span() + ); let storage_generator_trait = &line.storage_generator_trait; let storage_struct = &line.storage_struct; @@ -107,7 +110,7 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre } fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() + #storage_name_bstr } fn from_optional_value_to_query(v: Option<#value_type>) -> Self::Query { @@ -131,7 +134,7 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre } fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() + #storage_name_bstr } } @@ -146,7 +149,7 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre } fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() + #storage_name_bstr } fn from_optional_value_to_query(v: Option<#value_type>) -> Self::Query { @@ -171,7 +174,7 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre } fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() + #storage_name_bstr } } @@ -189,7 +192,7 @@ pub fn decl_and_impl(scrate: &TokenStream, def: &DeclStorageDefExt) -> TokenStre } fn storage_prefix() -> &'static [u8] { - #storage_name_str.as_bytes() + #storage_name_bstr } fn from_optional_value_to_query(v: Option<#value_type>) -> Self::Query { -- GitLab From 05579fe5d500ca08721752fbf14ce40594eaf689 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 18 May 2020 19:43:31 +0300 Subject: [PATCH 075/150] Fix benchmarks and add check so that they won't break again (#6061) * fix benchmarks and add check * address review * fix line width --- .gitlab-ci.yml | 2 ++ bin/node/testing/src/bench.rs | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 12ae9bfc61..d41a86f302 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -175,6 +175,8 @@ cargo-check-benches: <<: *docker-env script: - BUILD_DUMMY_WASM_BINARY=1 time cargo +nightly check --benches --all + - cargo run --release -p node-bench -- ::node::import::native::sr25519::transfer_keep_alive::paritydb::small + - cargo run --release -p node-bench -- ::trie::read::small - sccache -s cargo-check-subkey: diff --git a/bin/node/testing/src/bench.rs b/bin/node/testing/src/bench.rs index 6c687d2f2a..5b8f2e2083 100644 --- a/bin/node/testing/src/bench.rs +++ b/bin/node/testing/src/bench.rs @@ -297,9 +297,8 @@ impl BenchDb { &self.keyring, ); - let version = client.runtime_version_at(&BlockId::number(0)) - .expect("There should be runtime version at 0") - .spec_version; + let runtime_version = client.runtime_version_at(&BlockId::number(0)) + .expect("There should be runtime version at 0"); let genesis_hash = client.block_hash(Zero::zero()) .expect("Database error?") @@ -364,7 +363,8 @@ impl BenchDb { }, }, }, - version, + runtime_version.spec_version, + runtime_version.transaction_version, genesis_hash, ); @@ -462,10 +462,16 @@ impl BenchKeyring { } /// Sign transaction with keypair from this keyring. - pub fn sign(&self, xt: CheckedExtrinsic, version: u32, genesis_hash: [u8; 32]) -> UncheckedExtrinsic { + pub fn sign( + &self, + xt: CheckedExtrinsic, + spec_version: u32, + tx_version: u32, + genesis_hash: [u8; 32] + ) -> UncheckedExtrinsic { match xt.signed { Some((signed, extra)) => { - let payload = (xt.function, extra.clone(), version, genesis_hash, genesis_hash); + let payload = (xt.function, extra.clone(), spec_version, tx_version, genesis_hash, genesis_hash); let key = self.accounts.get(&signed).expect("Account id not found in keyring"); let signature = payload.using_encoded(|b| { if b.len() > 256 { -- GitLab From 1208821351a89b88315947730577b923a9a81167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= Date: Mon, 18 May 2020 18:44:29 +0200 Subject: [PATCH 076/150] Include post dispatch corrected weight in extrinsic events (#6024) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Include post dispatch corrected weight in extrinsic events * Drop the 'Post' from ApplyExtrinsicResultWithPostInfo to make it less verbose * Apply suggestions from code review Co-authored-by: Bastian Köcher * Use proper Event type in pallet_system tests * Add test that the actual weight is returned by events * Make fn extract_actual_weight cap at pre dispatch weight * Bump spec version Co-authored-by: Bastian Köcher Co-authored-by: Gavin Wood --- bin/node/runtime/src/lib.rs | 4 +- frame/executive/src/lib.rs | 9 +- frame/support/src/weights.rs | 37 +++- frame/system/src/lib.rs | 184 ++++++++++++++---- .../runtime/src/generic/checked_extrinsic.rs | 8 +- primitives/runtime/src/lib.rs | 4 + primitives/runtime/src/testing.rs | 8 +- primitives/runtime/src/traits.rs | 2 +- 8 files changed, 202 insertions(+), 54 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 7d877676c0..bc44bee8db 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -93,8 +93,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 248, - impl_version: 2, + spec_version: 249, + impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index fcef03883b..499fd3ebdf 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -119,6 +119,7 @@ use sp_std::{prelude::*, marker::PhantomData}; use frame_support::{ storage::StorageValue, weights::{GetDispatchInfo, DispatchInfo, DispatchClass}, traits::{OnInitialize, OnFinalize, OnRuntimeUpgrade, OffchainWorker}, + dispatch::PostDispatchInfo, }; use sp_runtime::{ generic::Digest, ApplyExtrinsicResult, @@ -174,7 +175,7 @@ where CheckedOf: Applyable + GetDispatchInfo, - CallOf: Dispatchable, + CallOf: Dispatchable, OriginOf: From>, UnsignedValidator: ValidateUnsigned>, { @@ -200,7 +201,7 @@ where CheckedOf: Applyable + GetDispatchInfo, - CallOf: Dispatchable, + CallOf: Dispatchable, OriginOf: From>, UnsignedValidator: ValidateUnsigned>, { @@ -368,9 +369,9 @@ where let dispatch_info = xt.get_dispatch_info(); let r = Applyable::apply::(xt, &dispatch_info, encoded_len)?; - >::note_applied_extrinsic(&r, encoded_len as u32, dispatch_info); + >::note_applied_extrinsic(&r, dispatch_info); - Ok(r) + Ok(r.map(|_| ()).map_err(|e| e.error)) } fn final_checks(header: &System::Header) { diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index 27f2aef586..a0d150cbe9 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -134,7 +134,7 @@ use sp_runtime::{ traits::SignedExtension, generic::{CheckedExtrinsic, UncheckedExtrinsic}, }; -use crate::dispatch::{DispatchErrorWithPostInfo, DispatchError}; +use crate::dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo, DispatchError}; /// Re-export priority as type pub use sp_runtime::transaction_validity::TransactionPriority; @@ -281,6 +281,14 @@ impl PostDispatchInfo { } } +/// Extract the actual weight from a dispatch result if any or fall back to the default weight. +pub fn extract_actual_weight(result: &DispatchResultWithPostInfo, info: &DispatchInfo) -> Weight { + match result { + Ok(post_info) => &post_info.actual_weight, + Err(err) => &err.post_info.actual_weight, + }.unwrap_or_else(|| info.weight).min(info.weight) +} + impl From> for PostDispatchInfo { fn from(actual_weight: Option) -> Self { Self { @@ -616,4 +624,31 @@ mod tests { assert_eq!(Call::::f21().get_dispatch_info().weight, 45600); assert_eq!(Call::::f2().get_dispatch_info().class, DispatchClass::Normal); } + + #[test] + fn extract_actual_weight_works() { + let pre = DispatchInfo { + weight: 1000, + .. Default::default() + }; + assert_eq!(extract_actual_weight(&Ok(Some(7).into()), &pre), 7); + assert_eq!(extract_actual_weight(&Ok(Some(1000).into()), &pre), 1000); + assert_eq!( + extract_actual_weight(&Err(DispatchError::BadOrigin.with_weight(9)), &pre), + 9 + ); + } + + #[test] + fn extract_actual_weight_caps_at_pre_weight() { + let pre = DispatchInfo { + weight: 1000, + .. Default::default() + }; + assert_eq!(extract_actual_weight(&Ok(Some(1250).into()), &pre), 1000); + assert_eq!( + extract_actual_weight(&Err(DispatchError::BadOrigin.with_weight(1300)), &pre), + 1000 + ); + } } diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index e2516740d3..80bb03c963 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -102,7 +102,7 @@ use sp_std::marker::PhantomData; use sp_std::fmt::Debug; use sp_version::RuntimeVersion; use sp_runtime::{ - RuntimeDebug, Perbill, DispatchOutcome, DispatchError, DispatchResult, + RuntimeDebug, Perbill, DispatchError, DispatchResult, generic::{self, Era}, transaction_validity::{ ValidTransaction, TransactionPriority, TransactionLongevity, TransactionValidityError, @@ -126,8 +126,9 @@ use frame_support::{ }, weights::{ Weight, RuntimeDbWeight, DispatchInfo, PostDispatchInfo, DispatchClass, - FunctionOf, Pays, - } + FunctionOf, Pays, extract_actual_weight, + }, + dispatch::DispatchResultWithPostInfo, }; use codec::{Encode, Decode, FullCodec, EncodeLike}; @@ -1150,13 +1151,14 @@ impl Module { } /// To be called immediately after an extrinsic has been applied. - pub fn note_applied_extrinsic(r: &DispatchOutcome, _encoded_len: u32, info: DispatchInfo) { + pub fn note_applied_extrinsic(r: &DispatchResultWithPostInfo, mut info: DispatchInfo) { + info.weight = extract_actual_weight(r, &info); Self::deposit_event( match r { - Ok(()) => RawEvent::ExtrinsicSuccess(info), + Ok(_) => RawEvent::ExtrinsicSuccess(info), Err(err) => { sp_runtime::print(err); - RawEvent::ExtrinsicFailed(err.clone(), info) + RawEvent::ExtrinsicFailed(err.error, info) }, } ); @@ -1830,7 +1832,10 @@ pub(crate) mod tests { use sp_std::cell::RefCell; use sp_core::H256; use sp_runtime::{traits::{BlakeTwo256, IdentityLookup, SignedExtension}, testing::Header, DispatchError}; - use frame_support::{impl_outer_origin, parameter_types, assert_ok, assert_noop}; + use frame_support::{ + impl_outer_origin, parameter_types, assert_ok, assert_noop, + weights::WithPostDispatchInfo, + }; impl_outer_origin! { pub enum Origin for Test where system = super {} @@ -1894,7 +1899,7 @@ pub(crate) mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; - type Event = u16; + type Event = Event; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = DbWeight; @@ -1909,18 +1914,8 @@ pub(crate) mod tests { type OnKilledAccount = RecordKilled; } - impl From> for u16 { - fn from(e: Event) -> u16 { - match e { - Event::::ExtrinsicSuccess(..) => 100, - Event::::ExtrinsicFailed(..) => 101, - Event::::CodeUpdated => 102, - _ => 103, - } - } - } - type System = Module; + type SysEvent = ::Event; const CALL: &::Call = &Call; @@ -1978,14 +1973,14 @@ pub(crate) mod tests { InitKind::Full, ); System::note_finished_extrinsics(); - System::deposit_event(1u16); + System::deposit_event(SysEvent::CodeUpdated); System::finalize(); assert_eq!( System::events(), vec![ EventRecord { phase: Phase::Finalization, - event: 1u16, + event: SysEvent::CodeUpdated, topics: vec![], } ] @@ -1998,22 +1993,131 @@ pub(crate) mod tests { &Default::default(), InitKind::Full, ); - System::deposit_event(32u16); + System::deposit_event(SysEvent::NewAccount(32)); System::note_finished_initialize(); - System::deposit_event(42u16); - System::note_applied_extrinsic(&Ok(()), 0, Default::default()); - System::note_applied_extrinsic(&Err(DispatchError::BadOrigin), 0, Default::default()); + System::deposit_event(SysEvent::KilledAccount(42)); + System::note_applied_extrinsic(&Ok(().into()), Default::default()); + System::note_applied_extrinsic( + &Err(DispatchError::BadOrigin.into()), + Default::default() + ); System::note_finished_extrinsics(); - System::deposit_event(3u16); + System::deposit_event(SysEvent::NewAccount(3)); System::finalize(); assert_eq!( System::events(), vec![ - EventRecord { phase: Phase::Initialization, event: 32u16, topics: vec![] }, - EventRecord { phase: Phase::ApplyExtrinsic(0), event: 42u16, topics: vec![] }, - EventRecord { phase: Phase::ApplyExtrinsic(0), event: 100u16, topics: vec![] }, - EventRecord { phase: Phase::ApplyExtrinsic(1), event: 101u16, topics: vec![] }, - EventRecord { phase: Phase::Finalization, event: 3u16, topics: vec![] } + EventRecord { + phase: Phase::Initialization, + event: SysEvent::NewAccount(32), + topics: vec![], + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: SysEvent::KilledAccount(42), + topics: vec![] + }, + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: SysEvent::ExtrinsicSuccess(Default::default()), + topics: vec![] + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: SysEvent::ExtrinsicFailed( + DispatchError::BadOrigin.into(), + Default::default() + ), + topics: vec![] + }, + EventRecord { + phase: Phase::Finalization, + event: SysEvent::NewAccount(3), + topics: vec![] + }, + ] + ); + }); + } + + #[test] + fn deposit_event_uses_actual_weight() { + new_test_ext().execute_with(|| { + System::initialize( + &1, + &[0u8; 32].into(), + &[0u8; 32].into(), + &Default::default(), + InitKind::Full, + ); + System::note_finished_initialize(); + + let pre_info = DispatchInfo { + weight: 1000, + .. Default::default() + }; + System::note_applied_extrinsic( + &Ok(Some(300).into()), + pre_info, + ); + System::note_applied_extrinsic( + &Ok(Some(1000).into()), + pre_info, + ); + System::note_applied_extrinsic( + // values over the pre info should be capped at pre dispatch value + &Ok(Some(1200).into()), + pre_info, + ); + System::note_applied_extrinsic( + &Err(DispatchError::BadOrigin.with_weight(999)), + pre_info, + ); + + assert_eq!( + System::events(), + vec![ + EventRecord { + phase: Phase::ApplyExtrinsic(0), + event: SysEvent::ExtrinsicSuccess( + DispatchInfo { + weight: 300, + .. Default::default() + }, + ), + topics: vec![] + }, + EventRecord { + phase: Phase::ApplyExtrinsic(1), + event: SysEvent::ExtrinsicSuccess( + DispatchInfo { + weight: 1000, + .. Default::default() + }, + ), + topics: vec![] + }, + EventRecord { + phase: Phase::ApplyExtrinsic(2), + event: SysEvent::ExtrinsicSuccess( + DispatchInfo { + weight: 1000, + .. Default::default() + }, + ), + topics: vec![] + }, + EventRecord { + phase: Phase::ApplyExtrinsic(3), + event: SysEvent::ExtrinsicFailed( + DispatchError::BadOrigin.into(), + DispatchInfo { + weight: 999, + .. Default::default() + }, + ), + topics: vec![] + }, ] ); }); @@ -2040,9 +2144,9 @@ pub(crate) mod tests { ]; // We deposit a few events with different sets of topics. - System::deposit_event_indexed(&topics[0..3], 1u16); - System::deposit_event_indexed(&topics[0..1], 2u16); - System::deposit_event_indexed(&topics[1..2], 3u16); + System::deposit_event_indexed(&topics[0..3], SysEvent::NewAccount(1)); + System::deposit_event_indexed(&topics[0..1], SysEvent::NewAccount(2)); + System::deposit_event_indexed(&topics[1..2], SysEvent::NewAccount(3)); System::finalize(); @@ -2052,17 +2156,17 @@ pub(crate) mod tests { vec![ EventRecord { phase: Phase::Finalization, - event: 1u16, + event: SysEvent::NewAccount(1), topics: topics[0..3].to_vec(), }, EventRecord { phase: Phase::Finalization, - event: 2u16, + event: SysEvent::NewAccount(2), topics: topics[0..1].to_vec(), }, EventRecord { phase: Phase::Finalization, - event: 3u16, + event: SysEvent::NewAccount(3), topics: topics[1..2].to_vec(), } ] @@ -2485,7 +2589,11 @@ pub(crate) mod tests { assert_eq!( System::events(), - vec![EventRecord { phase: Phase::Initialization, event: 102u16, topics: vec![] }], + vec![EventRecord { + phase: Phase::Initialization, + event: SysEvent::CodeUpdated, + topics: vec![], + }], ); }); } diff --git a/primitives/runtime/src/generic/checked_extrinsic.rs b/primitives/runtime/src/generic/checked_extrinsic.rs index 5e4150cf2b..f355308a59 100644 --- a/primitives/runtime/src/generic/checked_extrinsic.rs +++ b/primitives/runtime/src/generic/checked_extrinsic.rs @@ -19,7 +19,8 @@ //! stage. use crate::traits::{ - self, Member, MaybeDisplay, SignedExtension, Dispatchable, DispatchInfoOf, ValidateUnsigned, + self, Member, MaybeDisplay, SignedExtension, Dispatchable, DispatchInfoOf, PostDispatchInfoOf, + ValidateUnsigned, }; use crate::transaction_validity::{TransactionValidity, TransactionSource}; @@ -67,7 +68,7 @@ where self, info: &DispatchInfoOf, len: usize, - ) -> crate::ApplyExtrinsicResult { + ) -> crate::ApplyExtrinsicResultWithInfo> { let (maybe_who, pre) = if let Some((id, extra)) = self.signed { let pre = Extra::pre_dispatch(extra, &id, &self.function, info, len)?; (Some(id), pre) @@ -81,8 +82,7 @@ where Ok(info) => info, Err(err) => err.post_info, }; - let res = res.map(|_| ()).map_err(|e| e.error); - Extra::post_dispatch(pre, info, &post_info, len, &res)?; + Extra::post_dispatch(pre, info, &post_info, len, &res.map(|_| ()).map_err(|e| e.error))?; Ok(res) } } diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index 361da3ee57..e2a489515f 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -536,6 +536,10 @@ pub type DispatchOutcome = Result<(), DispatchError>; /// - The extrinsic supplied a bad signature. This transaction won't become valid ever. pub type ApplyExtrinsicResult = Result; +/// Same as `ApplyExtrinsicResult` but augmented with `PostDispatchInfo` on success. +pub type ApplyExtrinsicResultWithInfo = + Result, transaction_validity::TransactionValidityError>; + /// Verify a signature on an encoded value in a lazy manner. This can be /// an optimization if the signature scheme has an "unsigned" escape hash. pub fn verify_encoded_lazy( diff --git a/primitives/runtime/src/testing.rs b/primitives/runtime/src/testing.rs index 2bb33ba6b5..1b826ace99 100644 --- a/primitives/runtime/src/testing.rs +++ b/primitives/runtime/src/testing.rs @@ -22,10 +22,10 @@ use std::{fmt::{self, Debug}, ops::Deref, cell::RefCell}; use crate::codec::{Codec, Encode, Decode}; use crate::traits::{ self, Checkable, Applyable, BlakeTwo256, OpaqueKeys, - SignedExtension, Dispatchable, DispatchInfoOf, + SignedExtension, Dispatchable, DispatchInfoOf, PostDispatchInfoOf, }; use crate::traits::ValidateUnsigned; -use crate::{generic, KeyTypeId, CryptoTypeId, ApplyExtrinsicResult}; +use crate::{generic, KeyTypeId, CryptoTypeId, ApplyExtrinsicResultWithInfo}; pub use sp_core::{H256, sr25519}; use sp_core::{crypto::{CryptoType, Dummy, key_types, Public}, U256}; use crate::transaction_validity::{TransactionValidity, TransactionValidityError, TransactionSource}; @@ -382,7 +382,7 @@ impl Applyable for TestXt where self, info: &DispatchInfoOf, len: usize, - ) -> ApplyExtrinsicResult { + ) -> ApplyExtrinsicResultWithInfo> { let maybe_who = if let Some((who, extra)) = self.signature { Extra::pre_dispatch(extra, &who, &self.call, info, len)?; Some(who) @@ -391,6 +391,6 @@ impl Applyable for TestXt where None }; - Ok(self.call.dispatch(maybe_who.into()).map(|_| ()).map_err(|e| e.error)) + Ok(self.call.dispatch(maybe_who.into())) } } diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 345f3db76b..7e7b5558b5 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -892,7 +892,7 @@ pub trait Applyable: Sized + Send + Sync { self, info: &DispatchInfoOf, len: usize, - ) -> crate::ApplyExtrinsicResult; + ) -> crate::ApplyExtrinsicResultWithInfo>; } /// A marker trait for something that knows the type of the runtime block. -- GitLab From 12e08fd25455053e3cedc8b19beb7e77330a5713 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 18 May 2020 19:57:08 +0200 Subject: [PATCH 077/150] Upgrade to libp2p v0.19 - Changes the default PeerId representation (#6064) * Upgrade to libp2p v0.19 * Listen on IPv6 by default * Increase channels sizes * Use spec-compliant noise protocol * Show legacy PeerId * Switch order of Noise protocols * Switch to crates.io version * Fix subkey's version * Fix line width and Wasm build * I think Wasm is fixed for real this time --- Cargo.lock | 118 +++++++++++++----------- bin/node/browser-testing/Cargo.toml | 2 +- bin/utils/subkey/Cargo.toml | 2 +- client/authority-discovery/Cargo.toml | 2 +- client/cli/src/params/network_params.rs | 3 + client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 7 +- client/network/src/discovery.rs | 35 +++---- client/network/src/service.rs | 15 ++- client/network/src/transport.rs | 40 ++++++-- client/network/test/Cargo.toml | 2 +- client/peerset/Cargo.toml | 2 +- client/telemetry/Cargo.toml | 2 +- primitives/consensus/common/Cargo.toml | 2 +- utils/browser/Cargo.toml | 2 +- 15 files changed, 143 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 70fb4956d4..336bc936f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -452,9 +452,9 @@ dependencies = [ [[package]] name = "bs58" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b170cd256a3f9fa6b9edae3e44a7dfdfc77e8124dbc3e2612d75f9c3e2396dae" +checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" [[package]] name = "bstr" @@ -2598,9 +2598,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ea742c86405b659c358223a8f0f9f5a9eb27bb6083894c6340959b05269662" +checksum = "3ec214d189b57e4412f079ac5a1442578d06b12ca7282ba4696104cc92ab96c1" dependencies = [ "bytes 0.5.4", "futures 0.3.4", @@ -2627,7 +2627,7 @@ dependencies = [ "libp2p-websocket", "libp2p-yamux", "multihash", - "parity-multiaddr 0.8.0", + "parity-multiaddr 0.9.0", "parking_lot 0.10.2", "pin-project", "smallvec 1.3.0", @@ -2636,9 +2636,9 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d2c17158c4dca984a77a5927aac6f0862d7f50c013470a415f93be498b5739" +checksum = "80a6000296bdbff540b6c00ef82108ef23aa68d195b9333823ea491562c338d7" dependencies = [ "asn1_der", "bs58", @@ -2652,7 +2652,7 @@ dependencies = [ "log", "multihash", "multistream-select", - "parity-multiaddr 0.8.0", + "parity-multiaddr 0.9.0", "parking_lot 0.10.2", "pin-project", "prost", @@ -2670,9 +2670,9 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "329127858e4728db5ab60c33d5ae352a999325fdf190ed022ec7d3a4685ae2e6" +checksum = "67f0d915bee5d457a6d113377101e1f06e86a4286778aa4c6939553e9a4d7033" dependencies = [ "quote 1.0.3", "syn 1.0.17", @@ -2680,9 +2680,9 @@ dependencies = [ [[package]] name = "libp2p-deflate" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad32b006ea922da8cc66e537cf2df4b0fad8ebaa467d2a8c63d7784ac252ec6" +checksum = "975c847575ef9b3d63f9c11d465e9a9b0ea940cfa408b93cc6981bbc3b1bac40" dependencies = [ "flate2", "futures 0.3.4", @@ -2691,9 +2691,9 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0d0993481203d68e5ce2f787d033fb0cac6b850659ed6c784612db678977c71" +checksum = "3cc186d9a941fd0207cf8f08ef225a735e2d7296258f570155e525f6ee732f87" dependencies = [ "futures 0.3.4", "libp2p-core", @@ -2702,9 +2702,9 @@ dependencies = [ [[package]] name = "libp2p-floodsub" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3673153ca967c179d745fadf047d069355d6669ecf7f261b450fbaebf1bffd3d" +checksum = "c6dd8cc558e0edde2d4a423d017efd6b36c1b6bf97f4304c83076895c5edaed8" dependencies = [ "cuckoofilter", "fnv", @@ -2719,9 +2719,9 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f7f3f79f060864db0317cc47641b7d35276dee52a0ffa91553fbd0c153863a3" +checksum = "ce48659363fe765c09d77eb5b2248e04362557b11bba3701f05879ad34919ccd" dependencies = [ "base64 0.11.0", "byteorder 1.3.4", @@ -2744,9 +2744,9 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38ca3eb807789e26f41c82ca7cd2b3843c66c5587b8b5f709a2f421f3061414" +checksum = "6a455af71c59473444eba05e83dbaa20262bdbd9b4154f22389510fbac16f201" dependencies = [ "futures 0.3.4", "libp2p-core", @@ -2760,9 +2760,9 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92cda1fb8149ea64d092a2b99d2bd7a2c309eee38ea322d02e4480bd6ee1759" +checksum = "41d6c1d5100973527ae70d82687465b17049c1b717a7964de38b8e65000878ff" dependencies = [ "arrayvec 0.5.1", "bytes 0.5.4", @@ -2787,9 +2787,9 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41e908d2aaf8ff0ec6ad1f02fe1844fd777fb0b03a68a226423630750ab99471" +checksum = "d5bc788d92111802cb0c92d2e032fa6f46333aaeb5650c2f37b5d3eba78cabe6" dependencies = [ "async-std", "data-encoding", @@ -2809,9 +2809,9 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0832882b06619b2e81d74e71447753ea3c068164a0bca67847d272e856a04a02" +checksum = "4095bce2100f840883f1f75dbd010c966ee4ad323ae9f82026396da5cf6cce68" dependencies = [ "bytes 0.5.4", "fnv", @@ -2825,9 +2825,9 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918e94a649e1139c24ee9f1f8c1f2adaba6d157b9471af787f2d9beac8c29c77" +checksum = "84fd504e27b0eadd451e06b67694ef714bd8374044e7db339bb0cdb83755ddf4" dependencies = [ "curve25519-dalek", "futures 0.3.4", @@ -2846,9 +2846,9 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bfbf87eebb492d040f9899c5c81c9738730465ac5e78d9b7a7d086d0f07230" +checksum = "82930c36490008b1ef2f26c237a2c205c38ef6edc263738d0528b842740ab09f" dependencies = [ "futures 0.3.4", "libp2p-core", @@ -2861,9 +2861,9 @@ dependencies = [ [[package]] name = "libp2p-plaintext" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabb00553a49bf6d4a8ce362f6eefac410227a14d03c3acffbb8cc3f022ea019" +checksum = "ad28fe7beaa3e516ee8ba2af8c4f6820f269afa60d661831e879f2afea64f4a0" dependencies = [ "bytes 0.5.4", "futures 0.3.4", @@ -2879,9 +2879,9 @@ dependencies = [ [[package]] name = "libp2p-pnet" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f81b8b37ff529e1f51c20c396dac657def2108da174c1d27e57e72c9fe2d411" +checksum = "dabaa2194e1ce3c51cd78d734dd4c81dc5c7b150b309cbf9029df044034ac261" dependencies = [ "futures 0.3.4", "log", @@ -2893,9 +2893,9 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a0509a7e47245259954fef58b85b81bf4d29ae33a4365e38d718a866698774" +checksum = "22e30b873276846181fa9c04126653678c2797cb1556361d01b7b7fd6bf24682" dependencies = [ "aes-ctr", "ctr", @@ -2923,9 +2923,9 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44ab289ae44cc691da0a6fe96aefa43f26c86c6c7813998e203f6d80f1860f18" +checksum = "b4a8101a0e0d5f04562137a476bf5f5423cd5bdab2f7e43a75909668e63cb102" dependencies = [ "futures 0.3.4", "libp2p-core", @@ -2938,9 +2938,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b37ea44823d3ed223e4605da94b50177bc520f05ae2452286700549a32d81669" +checksum = "4462bd96b97cac3f3a83b1b343ad3c3460cebbc8d929c040b1520c30e3611e08" dependencies = [ "async-std", "futures 0.3.4", @@ -2949,13 +2949,14 @@ dependencies = [ "ipnet", "libp2p-core", "log", + "socket2", ] [[package]] name = "libp2p-uds" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281c18ea2faacb9c8a6ff76c4405df5918d9a263770e3847bf03f099abadc010" +checksum = "69660d235449bb2d99333b9892c9176d06fd2b380490cb8213feb5b015678cf1" dependencies = [ "async-std", "futures 0.3.4", @@ -2965,9 +2966,9 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ac7dbde0f88cad191dcdfd073b8bae28d01823e8ca313f117b6ecb914160c3" +checksum = "f59fdbb5706f2723ca108c088b1c7a37f735a8c328021f0508007162627e9885" dependencies = [ "futures 0.3.4", "js-sys", @@ -2979,9 +2980,9 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6874c9069ce93d899df9dc7b29f129c706b2a0fdc048f11d878935352b580190" +checksum = "085fbe4c05c4116c2164ab4d5a521eb6e00516c444f61b3ee9f68c7b1e53580b" dependencies = [ "async-tls", "bytes 0.5.4", @@ -3000,9 +3001,9 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f91aea50f6571e0bc6c058dc0e9b270afd41ec28dd94e9e4bf607e78b9ab87" +checksum = "0b305d3a8981e68f11c0e17f2d11d5c52fae95e0d7c283f9e462b5b2dab413b2" dependencies = [ "futures 0.3.4", "libp2p-core", @@ -3269,9 +3270,9 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "multihash" -version = "0.10.1" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fbc227f7e2b1cb701f95404579ecb2668abbdd3c7ef7a6cbb3cc0d3b236869" +checksum = "ae32179a9904ccc6e063de8beee7f5dd55fae85ecb851ca923d55722bc28cf5d" dependencies = [ "blake2b_simd", "blake2s_simd", @@ -4773,9 +4774,9 @@ dependencies = [ [[package]] name = "parity-multiaddr" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db35e222f783ef4e6661873f6c165c4eb7b65e0c408349818517d5705c2d7d3" +checksum = "12ca96399f4a01aa89c59220c4f52ac371940eb4e53e3ce990da796f364bdf69" dependencies = [ "arrayref", "bs58", @@ -6461,6 +6462,7 @@ dependencies = [ "assert_matches", "async-std", "bitflags", + "bs58", "bytes 0.5.4", "derive_more", "either", @@ -7218,6 +7220,18 @@ dependencies = [ "x25519-dalek", ] +[[package]] +name = "socket2" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "winapi 0.3.8", +] + [[package]] name = "soketto" version = "0.3.2" diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 3885aa3b09..04d48c8cbd 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" [dependencies] futures-timer = "3.0.2" -libp2p = { version = "0.18.0", default-features = false } +libp2p = { version = "0.19.0", default-features = false } jsonrpc-core = "14.0.5" serde = "1.0.106" serde_json = "1.0.48" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 488b0f7fbc..9c4ca36e16 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -33,7 +33,7 @@ derive_more = { version = "0.99.2" } sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" -libp2p = "0.18.1" +libp2p = "0.19.0" serde_json = "1.0" [features] diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index d2b74b51e1..69d5c51846 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", default-features = false, version = "1 derive_more = "0.99.2" futures = "0.3.4" futures-timer = "3.0.1" -libp2p = { version = "0.18.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.19.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} prost = "0.6.1" diff --git a/client/cli/src/params/network_params.rs b/client/cli/src/params/network_params.rs index cd64783ec9..e328c32a40 100644 --- a/client/cli/src/params/network_params.rs +++ b/client/cli/src/params/network_params.rs @@ -123,6 +123,9 @@ impl NetworkParams { let listen_addresses = if self.listen_addr.is_empty() { vec![ + Multiaddr::empty() + .with(Protocol::Ip6([0, 0, 0, 0, 0, 0, 0, 0].into())) + .with(Protocol::Tcp(port)), Multiaddr::empty() .with(Protocol::Ip4([0, 0, 0, 0].into())) .with(Protocol::Tcp(port)), diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index d46e3420ea..10b4a9446e 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" futures-timer = "3.0.1" -libp2p = { version = "0.18.1", default-features = false, features = ["websocket"] } +libp2p = { version = "0.19.0", default-features = false, features = ["websocket"] } log = "0.4.8" lru = "0.4.3" sc-network = { version = "0.8.0-dev", path = "../network" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 537ab43672..01121b922d 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -19,6 +19,7 @@ prost-build = "0.6.1" [dependencies] bitflags = "1.2.0" +bs58 = "0.3.1" bytes = "0.5.0" codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } derive_more = "0.99.2" @@ -62,15 +63,15 @@ wasm-timer = "0.2" zeroize = "1.0.0" [dependencies.libp2p] -version = "0.18.1" +version = "0.19.0" default-features = false -features = ["websocket", "kad", "mdns", "ping", "identify", "mplex", "yamux", "noise"] +features = ["websocket", "kad", "mdns", "ping", "identify", "mplex", "yamux", "noise", "tcp-async-std"] [dev-dependencies] async-std = "1.5" assert_matches = "1.3" env_logger = "0.7.0" -libp2p = { version = "0.18.1", default-features = false, features = ["secio"] } +libp2p = { version = "0.19.0", default-features = false, features = ["secio"] } quickcheck = "0.9.0" rand = "0.7.2" sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 00adc56ec5..dd5e093876 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -52,7 +52,7 @@ use ip_network::IpNetwork; use libp2p::core::{connection::{ConnectionId, ListenerId}, ConnectedPoint, Multiaddr, PeerId, PublicKey}; use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters, ProtocolsHandler}; use libp2p::swarm::protocols_handler::multi::MultiHandler; -use libp2p::kad::{Kademlia, KademliaConfig, KademliaEvent, Quorum, Record}; +use libp2p::kad::{Kademlia, KademliaConfig, KademliaEvent, QueryResult, Quorum, Record}; use libp2p::kad::GetClosestPeersError; use libp2p::kad::handler::KademliaHandler; use libp2p::kad::QueryId; @@ -177,7 +177,7 @@ impl DiscoveryConfig { kademlias: self.kademlias, next_kad_random_query: Delay::new(Duration::new(0, 0)), duration_to_next_kad: Duration::from_secs(1), - discoveries: VecDeque::new(), + pending_events: VecDeque::new(), local_peer_id: self.local_peer_id, num_connections: 0, allow_private_ipv4: self.allow_private_ipv4, @@ -213,8 +213,8 @@ pub struct DiscoveryBehaviour { next_kad_random_query: Delay, /// After `next_kad_random_query` triggers, the next one triggers after this duration. duration_to_next_kad: Duration, - /// Discovered nodes to return. - discoveries: VecDeque, + /// Events to return in priority when polled. + pending_events: VecDeque, /// Identity of our local node. local_peer_id: PeerId, /// Number of nodes we're currently connected to. @@ -248,7 +248,7 @@ impl DiscoveryBehaviour { for k in self.kademlias.values_mut() { k.add_address(&peer_id, addr.clone()) } - self.discoveries.push_back(peer_id.clone()); + self.pending_events.push_back(DiscoveryOut::Discovered(peer_id.clone())); self.user_defined.push((peer_id, addr)); } } @@ -272,7 +272,7 @@ impl DiscoveryBehaviour { /// A corresponding `ValueFound` or `ValueNotFound` event will later be generated. pub fn get_value(&mut self, key: &record::Key) { for k in self.kademlias.values_mut() { - k.get_record(key, Quorum::One) + k.get_record(key, Quorum::One); } } @@ -282,7 +282,10 @@ impl DiscoveryBehaviour { /// A corresponding `ValuePut` or `ValuePutFailed` event will later be generated. pub fn put_value(&mut self, key: record::Key, value: Vec) { for k in self.kademlias.values_mut() { - k.put_record(Record::new(key.clone(), value.clone()), Quorum::All) + if let Err(e) = k.put_record(Record::new(key.clone(), value.clone()), Quorum::All) { + warn!(target: "sub-libp2p", "Libp2p => Failed to put record: {:?}", e); + self.pending_events.push_back(DiscoveryOut::ValuePutFailed(key.clone())); + } } } @@ -528,8 +531,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { >, > { // Immediately process the content of `discovered`. - if let Some(peer_id) = self.discoveries.pop_front() { - let ev = DiscoveryOut::Discovered(peer_id); + if let Some(ev) = self.pending_events.pop_front() { return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } @@ -541,7 +543,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { "Libp2p <= Starting random Kademlia request for {:?}", random_peer_id); for k in self.kademlias.values_mut() { - k.get_closest_peers(random_peer_id.clone()) + k.get_closest_peers(random_peer_id.clone()); } true } else { @@ -578,7 +580,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { let ev = DiscoveryOut::Discovered(peer); return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } - KademliaEvent::GetClosestPeersResult(res) => { + KademliaEvent::QueryResult { result: QueryResult::GetClosestPeers(res), .. } => { match res { Err(GetClosestPeersError::Timeout { key, peers }) => { debug!(target: "sub-libp2p", @@ -596,7 +598,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { } } } - KademliaEvent::GetRecordResult(res) => { + KademliaEvent::QueryResult { result: QueryResult::GetRecord(res), .. } => { let ev = match res { Ok(ok) => { let results = ok.records @@ -619,7 +621,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { }; return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } - KademliaEvent::PutRecordResult(res) => { + KademliaEvent::QueryResult { result: QueryResult::PutRecord(res), .. } => { let ev = match res { Ok(ok) => DiscoveryOut::ValuePut(ok.key), Err(e) => { @@ -630,7 +632,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { }; return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } - KademliaEvent::RepublishRecordResult(res) => { + KademliaEvent::QueryResult { result: QueryResult::RepublishRecord(res), .. } => { match res { Ok(ok) => debug!(target: "sub-libp2p", "Libp2p => Record republished: {:?}", @@ -675,9 +677,8 @@ impl NetworkBehaviour for DiscoveryBehaviour { continue; } - self.discoveries.extend(list.map(|(peer_id, _)| peer_id)); - if let Some(peer_id) = self.discoveries.pop_front() { - let ev = DiscoveryOut::Discovered(peer_id); + self.pending_events.extend(list.map(|(peer_id, _)| DiscoveryOut::Discovered(peer_id))); + if let Some(ev) = self.pending_events.pop_front() { return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)); } }, diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 4b05c26335..331580ecb4 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -59,10 +59,11 @@ use sp_runtime::{ }; use sp_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use std::{ - borrow::Cow, + borrow::{Borrow, Cow}, collections::HashSet, fs, io, marker::PhantomData, + num:: NonZeroUsize, pin::Pin, str, sync::{ @@ -185,7 +186,13 @@ impl NetworkWorker { let local_identity = params.network_config.node_key.clone().into_keypair()?; let local_public = local_identity.public(); let local_peer_id = local_public.clone().into_peer_id(); - info!(target: "sub-libp2p", "🏷 Local node identity is: {}", local_peer_id.to_base58()); + let local_peer_id_legacy = bs58::encode(Borrow::<[u8]>::borrow(&local_peer_id)).into_string(); + info!( + target: "sub-libp2p", + "🏷 Local node identity is: {} (legacy representation: {})", + local_peer_id.to_base58(), + local_peer_id_legacy + ); // Initialize the metrics. let metrics = match ¶ms.metrics_registry { @@ -287,7 +294,9 @@ impl NetworkWorker { transport::build_transport(local_identity, config_mem, config_wasm, flowctrl) }; let mut builder = SwarmBuilder::new(transport, behaviour, local_peer_id.clone()) - .peer_connection_limit(crate::MAX_CONNECTIONS_PER_PEER); + .peer_connection_limit(crate::MAX_CONNECTIONS_PER_PEER) + .notify_handler_buffer_size(NonZeroUsize::new(16).expect("16 != 0; qed")) + .connection_event_buffer_size(128); if let Some(spawner) = params.executor { struct SpawnImpl(F); impl + Send>>)> Executor for SpawnImpl { diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index c241d25034..7b42211433 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -18,11 +18,14 @@ use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, + core::{ + self, either::{EitherError, EitherOutput}, muxing::StreamMuxerBox, + transport::{boxed::Boxed, OptionalTransport}, upgrade + }, mplex, identity, bandwidth, wasm_ext, noise }; #[cfg(not(target_os = "unknown"))] use libp2p::{tcp, dns, websocket}; -use libp2p::core::{self, upgrade, transport::boxed::Boxed, transport::OptionalTransport, muxing::StreamMuxerBox}; use std::{io, sync::Arc, time::Duration, usize}; pub use self::bandwidth::BandwidthSinks; @@ -42,14 +45,22 @@ pub fn build_transport( ) -> (Boxed<(PeerId, StreamMuxerBox), io::Error>, Arc) { // Build configuration objects for encryption mechanisms. let noise_config = { - let noise_keypair = noise::Keypair::new().into_authentic(&keypair) - // For more information about this panic, see in "On the Importance of Checking - // Cryptographic Protocols for Faults" by Dan Boneh, Richard A. DeMillo, - // and Richard J. Lipton. + // For more information about these two panics, see in "On the Importance of + // Checking Cryptographic Protocols for Faults" by Dan Boneh, Richard A. DeMillo, + // and Richard J. Lipton. + let noise_keypair_legacy = noise::Keypair::::new().into_authentic(&keypair) .expect("can only fail in case of a hardware bug; since this signing is performed only \ once and at initialization, we're taking the bet that the inconvenience of a very \ rare panic here is basically zero"); - noise::NoiseConfig::ix(noise_keypair) + let noise_keypair_spec = noise::Keypair::::new().into_authentic(&keypair) + .expect("can only fail in case of a hardware bug; since this signing is performed only \ + once and at initialization, we're taking the bet that the inconvenience of a very \ + rare panic here is basically zero"); + + core::upgrade::SelectUpgrade::new( + noise::NoiseConfig::xx(noise_keypair_spec), + noise::NoiseConfig::ix(noise_keypair_legacy) + ) }; // Build configuration objects for multiplexing mechanisms. @@ -97,11 +108,22 @@ pub fn build_transport( // Encryption let transport = transport.and_then(move |stream, endpoint| { core::upgrade::apply(stream, noise_config, endpoint, upgrade::Version::V1) - .and_then(|(remote_id, out)| async move { - let remote_key = match remote_id { - noise::RemoteIdentity::IdentityKey(key) => key, + .map_err(|err| + err.map_err(|err| match err { + EitherError::A(err) => err, + EitherError::B(err) => err, + }) + ) + .and_then(|result| async move { + let remote_key = match &result { + EitherOutput::First((noise::RemoteIdentity::IdentityKey(key), _)) => key.clone(), + EitherOutput::Second((noise::RemoteIdentity::IdentityKey(key), _)) => key.clone(), _ => return Err(upgrade::UpgradeError::Apply(noise::NoiseError::InvalidKey)) }; + let out = match result { + EitherOutput::First((_, o)) => o, + EitherOutput::Second((_, o)) => o, + }; Ok((out, remote_key.into_peer_id())) }) }); diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 5abc9a1ea7..58ad79163b 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -19,7 +19,7 @@ parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" rand = "0.7.2" -libp2p = { version = "0.18.1", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.19.0", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } sc-client-api = { version = "2.0.0-dev", path = "../../api" } diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index b4c5005324..f47ea7a70e 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" -libp2p = { version = "0.18.1", default-features = false } +libp2p = { version = "0.19.0", default-features = false } sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils"} log = "0.4.8" serde_json = "1.0.41" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index e2c08babf3..8ab0f828d1 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -19,7 +19,7 @@ parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" wasm-timer = "0.2.0" -libp2p = { version = "0.18.1", default-features = false, features = ["websocket", "wasm-ext", "tcp", "dns"] } +libp2p = { version = "0.19.0", default-features = false, features = ["websocket", "wasm-ext", "tcp-async-std", "dns"] } log = "0.4.8" pin-project = "0.4.6" rand = "0.7.2" diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index ec05e9fba1..6fda982dae 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -libp2p = { version = "0.18.1", default-features = false } +libp2p = { version = "0.19.0", default-features = false } log = "0.4.8" sp-core = { path= "../../core", version = "2.0.0-dev"} sp-inherents = { version = "2.0.0-dev", path = "../../inherents" } diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index ec37c8b139..ca69206ce3 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] futures = { version = "0.3", features = ["compat"] } futures01 = { package = "futures", version = "0.1.29" } log = "0.4.8" -libp2p-wasm-ext = { version = "0.18.0", features = ["websocket"] } +libp2p-wasm-ext = { version = "0.19.0", features = ["websocket"] } console_error_panic_hook = "0.1.6" console_log = "0.1.2" js-sys = "0.3.34" -- GitLab From bc413d19e5c63378e9a02faa566aa6571cfe2933 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Mon, 18 May 2020 16:13:30 -0400 Subject: [PATCH 078/150] Make GrandpaBlockImport public (#6068) --- client/finality-grandpa/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index ab73abc3de..41dedc2246 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -118,6 +118,7 @@ mod voting_rule; pub use authorities::SharedAuthoritySet; pub use finality_proof::{FinalityProofProvider, StorageAndProofProvider}; +pub use import::GrandpaBlockImport; pub use justification::GrandpaJustification; pub use light_import::light_block_import; pub use voting_rule::{ @@ -127,7 +128,6 @@ pub use finality_grandpa::voter::report; use aux_schema::PersistentData; use environment::{Environment, VoterSetState}; -use import::GrandpaBlockImport; use until_imported::UntilGlobalMessageBlocksImported; use communication::{NetworkBridge, Network as NetworkT}; use sp_finality_grandpa::{AuthorityList, AuthorityPair, AuthoritySignature, SetId}; -- GitLab From 0947c5b72cebee15e22870cd0087d58727f91aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Tue, 19 May 2020 02:16:48 +0100 Subject: [PATCH 079/150] service: fix RPC unsafe exposed address detection (#6070) --- client/service/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index feae664301..9e97bb5756 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -553,8 +553,8 @@ fn start_rpc_servers sc_rpc_server::RpcHandler, methods: &RpcMethods) -> sc_rpc::DenyUnsafe { - let is_exposed_addr = addr.map(|x| x.ip().is_loopback()).unwrap_or(false); + fn deny_unsafe(addr: &SocketAddr, methods: &RpcMethods) -> sc_rpc::DenyUnsafe { + let is_exposed_addr = !addr.ip().is_loopback(); match (is_exposed_addr, methods) { | (_, RpcMethods::Unsafe) | (false, RpcMethods::Auto) => sc_rpc::DenyUnsafe::No, @@ -568,7 +568,7 @@ fn start_rpc_servers sc_rpc_server::RpcHandler sc_rpc_server::RpcHandler Date: Tue, 19 May 2020 11:36:59 +0200 Subject: [PATCH 080/150] Clean a number of sp_io imports (#6072) --- frame/aura/Cargo.toml | 8 +++----- frame/authority-discovery/Cargo.toml | 6 ++---- frame/authorship/Cargo.toml | 8 ++++---- frame/babe/Cargo.toml | 4 ++-- frame/balances/Cargo.toml | 3 +-- frame/benchmarking/Cargo.toml | 2 +- frame/executive/Cargo.toml | 2 +- frame/offences/benchmarking/Cargo.toml | 4 +--- frame/session/Cargo.toml | 5 ++--- frame/session/benchmarking/Cargo.toml | 2 +- frame/society/Cargo.toml | 3 +-- frame/support/test/Cargo.toml | 2 +- frame/system/Cargo.toml | 2 +- frame/system/benchmarking/Cargo.toml | 2 +- frame/vesting/Cargo.toml | 3 +-- 15 files changed, 23 insertions(+), 33 deletions(-) diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index cd7f17ba13..5a8445d270 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -15,20 +15,20 @@ targets = ["x86_64-unknown-linux-gnu"] sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -sp-consensus-aura = { path = "../../primitives/consensus/aura", default-features = false, version = "0.8.0-dev"} +sp-consensus-aura = { version = "0.8.0-dev", path = "../../primitives/consensus/aura", default-features = false } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } [dev-dependencies] +sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } lazy_static = "1.4.0" parking_lot = "0.10.0" @@ -38,8 +38,6 @@ std = [ "sp-application-crypto/std", "codec/std", "sp-inherents/std", - "sp-io/std", - "sp-core/std", "sp-std/std", "serde", "sp-runtime/std", diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index 134dff4017..24cbdbde0a 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authority-discovery" } sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } pallet-session = { version = "2.0.0-dev", features = ["historical" ], path = "../session", default-features = false } sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } [features] @@ -33,8 +33,6 @@ std = [ "sp-application-crypto/std", "sp-authority-discovery/std", "codec/std", - "sp-core/std", - "sp-io/std", "sp-std/std", "serde", "pallet-session/std", diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index d5769783a9..43a48b02a0 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -12,7 +12,6 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } sp-authorship = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authorship" } @@ -20,19 +19,20 @@ sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primit sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} impl-trait-for-tuples = "0.1.3" +[dev-dependencies] +sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } + [features] default = ["std"] std = [ "codec/std", - "sp-core/std", "sp-inherents/std", "sp-runtime/std", "sp-std/std", "frame-support/std", "frame-system/std", - "sp-io/std", "sp-authorship/std", ] diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 685e508a3d..23946203f3 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -26,7 +26,7 @@ sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../ pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } sp-consensus-vrf = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/vrf" } -sp-io = { path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } [dev-dependencies] sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } @@ -34,8 +34,8 @@ sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } [features] default = ["std"] std = [ - "serde", "codec/std", + "serde", "sp-std/std", "sp-application-crypto/std", "frame-support/std", diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index 3916d5605f..18b6fe8ced 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -15,13 +15,13 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } [dev-dependencies] +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } @@ -31,7 +31,6 @@ std = [ "serde", "codec/std", "sp-std/std", - "sp-io/std", "sp-runtime/std", "frame-benchmarking/std", "frame-support/std", diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index fcc8e0bf92..dd7de60c57 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -19,7 +19,7 @@ sp-api = { version = "2.0.0-dev", path = "../../primitives/api", default-feature sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface", default-features = false } sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime", default-features = false } sp-std = { version = "2.0.0-dev", path = "../../primitives/std", default-features = false } -sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-dev"} +sp-io = { version = "2.0.0-dev", path = "../../primitives/io", default-features = false } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index 84918f7361..edfd207bc9 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -24,7 +24,7 @@ sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primiti [dev-dependencies] hex-literal = "0.2.1" sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io ={ path = "../../primitives/io", version = "2.0.0-dev"} +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } pallet-indices = { version = "2.0.0-dev", path = "../indices" } pallet-balances = { version = "2.0.0-dev", path = "../balances" } pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } diff --git a/frame/offences/benchmarking/Cargo.toml b/frame/offences/benchmarking/Cargo.toml index ff77497db0..e9cd2be005 100644 --- a/frame/offences/benchmarking/Cargo.toml +++ b/frame/offences/benchmarking/Cargo.toml @@ -23,7 +23,6 @@ pallet-im-online = { version = "2.0.0-dev", default-features = false, path = ".. pallet-offences = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -sp-io = { path = "../../../primitives/io", default-features = false, version = "2.0.0-dev"} sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } @@ -34,7 +33,7 @@ pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/rew pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } serde = { version = "1.0.101" } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} +sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } [features] default = ["std"] @@ -52,5 +51,4 @@ std = [ "sp-runtime/std", "sp-staking/std", "sp-std/std", - "sp-io/std", ] diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index b03eea494a..8031804fcd 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -21,12 +21,12 @@ sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../pr frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -sp-trie = { optional = true, path = "../../primitives/trie", default-features = false, version = "2.0.0-dev"} -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-trie = { version = "2.0.0-dev", optional = true, default-features = false, path = "../../primitives/trie" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } lazy_static = "1.4.0" @@ -43,5 +43,4 @@ std = [ "sp-staking/std", "pallet-timestamp/std", "sp-trie/std", - "sp-io/std", ] diff --git a/frame/session/benchmarking/Cargo.toml b/frame/session/benchmarking/Cargo.toml index d263e1af9a..20ef9c6eb6 100644 --- a/frame/session/benchmarking/Cargo.toml +++ b/frame/session/benchmarking/Cargo.toml @@ -25,7 +25,7 @@ serde = { version = "1.0.101" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} +sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } pallet-balances = { version = "2.0.0-dev", path = "../../balances" } diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index 24380aff55..86c800d571 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -14,7 +14,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ path = "../../primitives/io", default-features = false , version = "2.0.0-dev"} sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } @@ -23,6 +22,7 @@ rand_chacha = { version = "0.2", default-features = false } [dev-dependencies] sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } pallet-balances = { version = "2.0.0-dev", path = "../balances" } [features] @@ -30,7 +30,6 @@ default = ["std"] std = [ "codec/std", "serde", - "sp-io/std", "sp-runtime/std", "rand_chacha/std", "sp-std/std", diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 59014d893c..e676106e17 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ path = "../../../primitives/io", default-features = false , version = "2.0.0-dev"} +sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io", default-features = false } sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../../primitives/state-machine" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../" } sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 099290f2c7..254938df2b 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -16,7 +16,7 @@ serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { path = "../../primitives/io", default-features = false, version = "2.0.0-dev"} +sp-io = { version = "2.0.0-dev", path = "../../primitives/io", default-features = false } sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } diff --git a/frame/system/benchmarking/Cargo.toml b/frame/system/benchmarking/Cargo.toml index 60ee030011..7ce619f413 100644 --- a/frame/system/benchmarking/Cargo.toml +++ b/frame/system/benchmarking/Cargo.toml @@ -22,7 +22,7 @@ sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../pr [dev-dependencies] serde = { version = "1.0.101" } -sp-io ={ path = "../../../primitives/io", version = "2.0.0-dev"} +sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml index 96282db360..70c97006df 100644 --- a/frame/vesting/Cargo.toml +++ b/frame/vesting/Cargo.toml @@ -16,13 +16,13 @@ serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] +sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } pallet-balances = { version = "2.0.0-dev", path = "../balances" } sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } @@ -34,7 +34,6 @@ std = [ "serde", "codec/std", "sp-std/std", - "sp-io/std", "sp-runtime/std", "frame-support/std", "frame-system/std", -- GitLab From 812d94d42c6d6d7fd28cf18a08d84f14c49d8544 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Tue, 19 May 2020 17:06:52 +0200 Subject: [PATCH 081/150] Detect obsolete block responses (#6077) --- client/network/src/behaviour.rs | 4 +- client/network/src/protocol.rs | 97 +++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 38 deletions(-) diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 2394d22319..dec8788f3f 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -311,13 +311,13 @@ impl NetworkBehaviourEventProcess { + block_requests::Event::Response { peer, original_request: _, response, request_duration } => { self.events.push_back(BehaviourOut::RequestFinished { peer: peer.clone(), protocol: self.block_requests.protocol_name().to_vec(), request_duration, }); - let ev = self.substrate.on_block_response(peer, original_request, response); + let ev = self.substrate.on_block_response(peer, response); self.inject_event(ev); } block_requests::Event::RequestCancelled { peer, request_duration, .. } | diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 421035e570..8a71494d82 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -548,30 +548,6 @@ impl Protocol { self.sync.update_chain_info(&info.best_hash, info.best_number); } - /// Accepts a response from the legacy substream and determines what the corresponding - /// request was. - fn handle_response( - &mut self, - who: PeerId, - response: &message::BlockResponse - ) -> Option> { - if let Some(ref mut peer) = self.context_data.peers.get_mut(&who) { - if peer.obsolete_requests.remove(&response.id).is_some() { - trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", who, response.id); - return None; - } - // Clear the request. If the response is invalid peer will be disconnected anyway. - let request = peer.block_request.take(); - if request.as_ref().map_or(false, |(_, r)| r.id == response.id) { - return request.map(|(_, r)| r) - } - trace!(target: "sync", "Unexpected response packet from {} ({})", who, response.id); - self.peerset_handle.report_peer(who.clone(), rep::UNEXPECTED_RESPONSE); - self.behaviour.disconnect_peer(&who); - } - None - } - fn update_peer_info(&mut self, who: &PeerId) { if let Some(info) = self.sync.peer_info(who) { if let Some(ref mut peer) = self.context_data.peers.get_mut(who) { @@ -609,11 +585,9 @@ impl Protocol { GenericMessage::Status(s) => return self.on_status_message(who, s), GenericMessage::BlockRequest(r) => self.on_block_request(who, r), GenericMessage::BlockResponse(r) => { - if let Some(request) = self.handle_response(who.clone(), &r) { - let outcome = self.on_block_response(who.clone(), request, r); - self.update_peer_info(&who); - return outcome - } + let outcome = self.on_block_response(who.clone(), r); + self.update_peer_info(&who); + return outcome }, GenericMessage::BlockAnnounce(announce) => { let outcome = self.on_block_announce(who.clone(), announce); @@ -705,6 +679,10 @@ impl Protocol { ); } + fn update_peer_request(&mut self, who: &PeerId, request: &mut message::BlockRequest) { + update_peer_request::(&mut self.context_data.peers, who, request) + } + /// Called when a new peer is connected pub fn on_peer_connected(&mut self, who: PeerId) { trace!(target: "sync", "Connecting {}", who); @@ -844,9 +822,34 @@ impl Protocol { pub fn on_block_response( &mut self, peer: PeerId, - request: message::BlockRequest, response: message::BlockResponse, ) -> CustomMessageOutcome { + let request = if let Some(ref mut p) = self.context_data.peers.get_mut(&peer) { + if p.obsolete_requests.remove(&response.id).is_some() { + trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", peer, response.id); + return CustomMessageOutcome::None; + } + // Clear the request. If the response is invalid peer will be disconnected anyway. + match p.block_request.take() { + Some((_, request)) if request.id == response.id => request, + Some(_) => { + trace!(target: "sync", "Ignoring obsolete block response packet from {} ({})", peer, response.id); + return CustomMessageOutcome::None; + } + None => { + trace!(target: "sync", "Unexpected response packet from unknown peer {}", peer); + self.behaviour.disconnect_peer(&peer); + self.peerset_handle.report_peer(peer, rep::UNEXPECTED_RESPONSE); + return CustomMessageOutcome::None; + } + } + } else { + trace!(target: "sync", "Unexpected response packet from unknown peer {}", peer); + self.behaviour.disconnect_peer(&peer); + self.peerset_handle.report_peer(peer, rep::UNEXPECTED_RESPONSE); + return CustomMessageOutcome::None; + }; + let blocks_range = || match ( response.blocks.first().and_then(|b| b.header.as_ref().map(|h| h.number())), response.blocks.last().and_then(|b| b.header.as_ref().map(|h| h.number())), @@ -891,8 +894,9 @@ impl Protocol { match self.sync.on_block_data(&peer, Some(request), response) { Ok(sync::OnBlockData::Import(origin, blocks)) => CustomMessageOutcome::BlockImport(origin, blocks), - Ok(sync::OnBlockData::Request(peer, req)) => { + Ok(sync::OnBlockData::Request(peer, mut req)) => { if self.use_new_block_requests_protocol { + self.update_peer_request(&peer, &mut req); CustomMessageOutcome::BlockRequest { target: peer, request: req, @@ -1076,8 +1080,9 @@ impl Protocol { if info.roles.is_full() { match self.sync.new_peer(who.clone(), info.best_hash, info.best_number) { Ok(None) => (), - Ok(Some(req)) => { + Ok(Some(mut req)) => { if self.use_new_block_requests_protocol { + self.update_peer_request(&who, &mut req); self.pending_messages.push_back(CustomMessageOutcome::BlockRequest { target: who.clone(), request: req, @@ -1413,8 +1418,9 @@ impl Protocol { Ok(sync::OnBlockData::Import(origin, blocks)) => { CustomMessageOutcome::BlockImport(origin, blocks) }, - Ok(sync::OnBlockData::Request(peer, req)) => { + Ok(sync::OnBlockData::Request(peer, mut req)) => { if self.use_new_block_requests_protocol { + self.update_peer_request(&peer, &mut req); CustomMessageOutcome::BlockRequest { target: peer, request: req, @@ -1520,8 +1526,9 @@ impl Protocol { ); for result in results { match result { - Ok((id, req)) => { + Ok((id, mut req)) => { if self.use_new_block_requests_protocol { + update_peer_request(&mut self.context_data.peers, &id, &mut req); self.pending_messages.push_back(CustomMessageOutcome::BlockRequest { target: id, request: req, @@ -1935,6 +1942,22 @@ fn send_request( send_message::(behaviour, stats, who, None, message) } +fn update_peer_request( + peers: &mut HashMap>, + who: &PeerId, + request: &mut message::BlockRequest, +) { + if let Some(ref mut peer) = peers.get_mut(who) { + request.id = peer.next_request_id; + peer.next_request_id += 1; + if let Some((timestamp, request)) = peer.block_request.take() { + trace!(target: "sync", "Request {} for {} is now obsolete.", request.id, who); + peer.obsolete_requests.insert(request.id, timestamp); + } + peer.block_request = Some((Instant::now(), request.clone())); + } +} + fn send_message( behaviour: &mut GenericProto, stats: &mut HashMap<&'static str, PacketStats>, @@ -2012,8 +2035,9 @@ impl NetworkBehaviour for Protocol { self.propagate_extrinsics(); } - for (id, r) in self.sync.block_requests() { + for (id, mut r) in self.sync.block_requests() { if self.use_new_block_requests_protocol { + update_peer_request(&mut self.context_data.peers, &id, &mut r); let event = CustomMessageOutcome::BlockRequest { target: id.clone(), request: r, @@ -2029,8 +2053,9 @@ impl NetworkBehaviour for Protocol { ) } } - for (id, r) in self.sync.justification_requests() { + for (id, mut r) in self.sync.justification_requests() { if self.use_new_block_requests_protocol { + update_peer_request(&mut self.context_data.peers, &id, &mut r); let event = CustomMessageOutcome::BlockRequest { target: id, request: r, -- GitLab From f34752327957f55c9076660b9bfb7ce750719b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= Date: Wed, 20 May 2020 11:39:45 +0200 Subject: [PATCH 082/150] Refactor OverlayedChanges (#5989) * Hide internal structure of OverlayChanges * Fix tests for OverlayChanges refactor * Do not clone pending changes Discarding prospective changes should be equivalent as a state machine is not to be called with peding changes. This will be replaced by a storage transaction that is rolled back before executing the call the second time removing this constraint. * Doc fixes * Remove overlong line * Revert "Do not clone pending changes" This reverts commit 4799491f4ac16f8517287a0fcf4a3f84ad56f46e. * Deduplicate chield tries returned from child_infos() * Remove redundant type annotation * Avoid changing the storage root in tests * Preserve extrinsic indices in trie build test * Swap order of comitted and prospective in fn child_infos This is only for consistency and does not impact the result. * Rename set_pending to replace_pending for clearity --- .../state-machine/src/changes_trie/build.rs | 138 +++++++----------- primitives/state-machine/src/ext.rs | 49 +++---- primitives/state-machine/src/lib.rs | 36 ++--- .../state-machine/src/overlayed_changes.rs | 68 +++++++-- primitives/state-machine/src/testing.rs | 24 ++- 5 files changed, 150 insertions(+), 165 deletions(-) diff --git a/primitives/state-machine/src/changes_trie/build.rs b/primitives/state-machine/src/changes_trie/build.rs index f8eabfce9b..f9698f1a31 100644 --- a/primitives/state-machine/src/changes_trie/build.rs +++ b/primitives/state-machine/src/changes_trie/build.rs @@ -17,7 +17,7 @@ //! Structures and functions required to build changes trie for given block. -use std::collections::{BTreeMap, BTreeSet}; +use std::collections::BTreeMap; use std::collections::btree_map::Entry; use codec::{Decode, Encode}; use hash_db::Hasher; @@ -33,7 +33,7 @@ use crate::{ input::{InputKey, InputPair, DigestIndex, ExtrinsicIndex, ChildIndex}, }, }; -use sp_core::storage::{ChildInfo, ChildType, PrefixedStorageKey}; +use sp_core::storage::{ChildInfo, PrefixedStorageKey}; /// Prepare input pairs for building a changes trie of given block. /// @@ -106,20 +106,18 @@ fn prepare_extrinsics_input<'a, B, H, Number>( H: Hasher + 'a, Number: BlockNumber, { - - let mut children_info = BTreeSet::::new(); let mut children_result = BTreeMap::new(); - for (_storage_key, (_map, child_info)) in changes.prospective.children_default.iter() - .chain(changes.committed.children_default.iter()) { - children_info.insert(child_info.clone()); - } - for child_info in children_info { + + for child_info in changes.child_infos() { let child_index = ChildIndex:: { block: block.clone(), storage_key: child_info.prefixed_storage_key(), }; - let iter = prepare_extrinsics_input_inner(backend, block, changes, Some(child_info))?; + let iter = prepare_extrinsics_input_inner( + backend, block, changes, + Some(child_info.clone()) + )?; children_result.insert(child_index, iter); } @@ -139,19 +137,8 @@ fn prepare_extrinsics_input_inner<'a, B, H, Number>( H: Hasher, Number: BlockNumber, { - let (committed, prospective) = if let Some(child_info) = child_info.as_ref() { - match child_info.child_type() { - ChildType::ParentKeyId => ( - changes.committed.children_default.get(child_info.storage_key()).map(|c| &c.0), - changes.prospective.children_default.get(child_info.storage_key()).map(|c| &c.0), - ), - } - } else { - (Some(&changes.committed.top), Some(&changes.prospective.top)) - }; - committed.iter().flat_map(|c| c.iter()) - .chain(prospective.iter().flat_map(|c| c.iter())) - .filter(|( _, v)| v.extrinsics.is_some()) + changes.changes(child_info.as_ref()) + .filter(|( _, v)| v.extrinsics().is_some()) .try_fold(BTreeMap::new(), |mut map: BTreeMap<&[u8], (ExtrinsicIndex, Vec)>, (k, v)| { match map.entry(k) { Entry::Vacant(entry) => { @@ -172,9 +159,10 @@ fn prepare_extrinsics_input_inner<'a, B, H, Number>( } }; - let extrinsics = v.extrinsics.as_ref() + let extrinsics = v.extrinsics() .expect("filtered by filter() call above; qed") - .iter().cloned().collect(); + .cloned() + .collect(); entry.insert((ExtrinsicIndex { block: block.clone(), key: k.to_vec(), @@ -185,9 +173,8 @@ fn prepare_extrinsics_input_inner<'a, B, H, Number>( // AND we are checking it before insertion let extrinsics = &mut entry.get_mut().1; extrinsics.extend( - v.extrinsics.as_ref() + v.extrinsics() .expect("filtered by filter() call above; qed") - .iter() .cloned() ); extrinsics.sort_unstable(); @@ -341,13 +328,10 @@ fn prepare_digest_input<'a, H, Number>( #[cfg(test)] mod test { - use codec::Encode; use sp_core::Blake2Hasher; - use sp_core::storage::well_known_keys::EXTRINSIC_INDEX; use crate::InMemoryBackend; use crate::changes_trie::{RootsStorage, Configuration, storage::InMemoryStorage}; use crate::changes_trie::build_cache::{IncompleteCacheAction, IncompleteCachedBuildData}; - use crate::overlayed_changes::{OverlayedValue, OverlayedChangeSet}; use super::*; fn prepare_for_build(zero: u64) -> ( @@ -367,8 +351,6 @@ mod test { (vec![105], vec![255]), ].into_iter().collect::>().into(); let prefixed_child_trie_key1 = child_info_1.prefixed_storage_key(); - let child_trie_key1 = child_info_1.storage_key().to_vec(); - let child_trie_key2 = child_info_2.storage_key().to_vec(); let storage = InMemoryStorage::with_inputs(vec![ (zero + 1, vec![ InputPair::ExtrinsicIndex(ExtrinsicIndex { block: zero + 1, key: vec![100] }, vec![1, 3]), @@ -418,58 +400,41 @@ mod test { ]), ]), ]); - let changes = OverlayedChanges { - prospective: OverlayedChangeSet { top: vec![ - (vec![100], OverlayedValue { - value: Some(vec![200]), - extrinsics: Some(vec![0, 2].into_iter().collect()) - }), - (vec![103], OverlayedValue { - value: None, - extrinsics: Some(vec![0, 1].into_iter().collect()) - }), - ].into_iter().collect(), - children_default: vec![ - (child_trie_key1.clone(), (vec![ - (vec![100], OverlayedValue { - value: Some(vec![200]), - extrinsics: Some(vec![0, 2].into_iter().collect()) - }) - ].into_iter().collect(), child_info_1.to_owned())), - (child_trie_key2, (vec![ - (vec![100], OverlayedValue { - value: Some(vec![200]), - extrinsics: Some(vec![0, 2].into_iter().collect()) - }) - ].into_iter().collect(), child_info_2.to_owned())), - ].into_iter().collect() - }, - committed: OverlayedChangeSet { top: vec![ - (EXTRINSIC_INDEX.to_vec(), OverlayedValue { - value: Some(3u32.encode()), - extrinsics: None, - }), - (vec![100], OverlayedValue { - value: Some(vec![202]), - extrinsics: Some(vec![3].into_iter().collect()) - }), - (vec![101], OverlayedValue { - value: Some(vec![203]), - extrinsics: Some(vec![1].into_iter().collect()) - }), - ].into_iter().collect(), - children_default: vec![ - (child_trie_key1, (vec![ - (vec![100], OverlayedValue { - value: Some(vec![202]), - extrinsics: Some(vec![3].into_iter().collect()) - }) - ].into_iter().collect(), child_info_1.to_owned())), - ].into_iter().collect(), - }, - collect_extrinsics: true, - stats: Default::default(), - }; + + let mut changes = OverlayedChanges::default(); + changes.set_collect_extrinsics(true); + + changes.set_extrinsic_index(1); + changes.set_storage(vec![101], Some(vec![203])); + + changes.set_extrinsic_index(3); + changes.set_storage(vec![100], Some(vec![202])); + changes.set_child_storage(&child_info_1, vec![100], Some(vec![202])); + + changes.commit_prospective(); + + changes.set_extrinsic_index(0); + changes.set_storage(vec![100], Some(vec![0])); + changes.set_extrinsic_index(2); + changes.set_storage(vec![100], Some(vec![200])); + + changes.set_extrinsic_index(0); + changes.set_storage(vec![103], Some(vec![0])); + changes.set_extrinsic_index(1); + changes.set_storage(vec![103], None); + + changes.set_extrinsic_index(0); + changes.set_child_storage(&child_info_1, vec![100], Some(vec![0])); + changes.set_extrinsic_index(2); + changes.set_child_storage(&child_info_1, vec![100], Some(vec![200])); + + changes.set_extrinsic_index(0); + changes.set_child_storage(&child_info_2, vec![100], Some(vec![0])); + changes.set_extrinsic_index(2); + changes.set_child_storage(&child_info_2, vec![100], Some(vec![200])); + + changes.set_extrinsic_index(1); + let config = Configuration { digest_interval: 4, digest_levels: 2 }; (backend, storage, changes, config) @@ -667,10 +632,7 @@ mod test { let (backend, storage, mut changes, config) = prepare_for_build(zero); // 110: missing from backend, set to None in overlay - changes.prospective.top.insert(vec![110], OverlayedValue { - value: None, - extrinsics: Some(vec![1].into_iter().collect()) - }); + changes.set_storage(vec![110], None); let parent = AnchorBlockId { hash: Default::default(), number: zero + 3 }; let changes_trie_nodes = prepare_input( diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index e4c619efe3..25c20644f7 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -147,8 +147,7 @@ where self.backend.pairs().iter() .map(|&(ref k, ref v)| (k.to_vec(), Some(v.to_vec()))) - .chain(self.overlay.committed.top.clone().into_iter().map(|(k, v)| (k, v.value))) - .chain(self.overlay.prospective.top.clone().into_iter().map(|(k, v)| (k, v.value))) + .chain(self.overlay.changes(None).map(|(k, v)| (k.clone(), v.value().cloned()))) .collect::>() .into_iter() .filter_map(|(k, maybe_val)| maybe_val.map(|val| (k, val))) @@ -293,7 +292,7 @@ where match (next_backend_key, next_overlay_key_change) { (Some(backend_key), Some(overlay_key)) if &backend_key[..] < overlay_key.0 => Some(backend_key), (backend_key, None) => backend_key, - (_, Some(overlay_key)) => if overlay_key.1.value.is_some() { + (_, Some(overlay_key)) => if overlay_key.1.value().is_some() { Some(overlay_key.0.to_vec()) } else { self.next_storage_key(&overlay_key.0[..]) @@ -317,7 +316,7 @@ where match (next_backend_key, next_overlay_key_change) { (Some(backend_key), Some(overlay_key)) if &backend_key[..] < overlay_key.0 => Some(backend_key), (backend_key, None) => backend_key, - (_, Some(overlay_key)) => if overlay_key.1.value.is_some() { + (_, Some(overlay_key)) => if overlay_key.1.value().is_some() { Some(overlay_key.0.to_vec()) } else { self.next_child_storage_key( @@ -479,18 +478,12 @@ where root.encode() } else { - if let Some(child_info) = self.overlay.default_child_info(storage_key).cloned() { + if let Some(child_info) = self.overlay.default_child_info(storage_key) { let (root, is_empty, _) = { - let delta = self.overlay.committed.children_default.get(storage_key) - .into_iter() - .flat_map(|(map, _)| map.clone().into_iter().map(|(k, v)| (k, v.value))) - .chain( - self.overlay.prospective.children_default.get(storage_key) - .into_iter() - .flat_map(|(map, _)| map.clone().into_iter().map(|(k, v)| (k, v.value))) - ); - - self.backend.child_storage_root(&child_info, delta) + let delta = self.overlay.changes(Some(child_info)) + .map(|(k, v)| (k.clone(), v.value().cloned())); + + self.backend.child_storage_root(child_info, delta) }; let root = root.encode(); @@ -677,28 +670,19 @@ mod tests { changes_trie::{ Configuration as ChangesTrieConfiguration, InMemoryStorage as TestChangesTrieStorage, - }, InMemoryBackend, overlayed_changes::OverlayedValue, + }, InMemoryBackend, }; type TestBackend = InMemoryBackend; type TestExt<'a> = Ext<'a, Blake2Hasher, u64, TestBackend>; fn prepare_overlay_with_changes() -> OverlayedChanges { - OverlayedChanges { - prospective: vec![ - (EXTRINSIC_INDEX.to_vec(), OverlayedValue { - value: Some(3u32.encode()), - extrinsics: Some(vec![1].into_iter().collect()) - }), - (vec![1], OverlayedValue { - value: Some(vec![100].into_iter().collect()), - extrinsics: Some(vec![1].into_iter().collect()) - }), - ].into_iter().collect(), - committed: Default::default(), - collect_extrinsics: true, - stats: Default::default(), - } + let mut changes = OverlayedChanges::default(); + changes.set_collect_extrinsics(true); + changes.set_extrinsic_index(1); + changes.set_storage(vec![1], Some(vec![100])); + changes.set_storage(EXTRINSIC_INDEX.to_vec(), Some(3u32.encode())); + changes } fn prepare_offchain_overlay_with_changes() -> OffchainOverlayedChanges { @@ -755,7 +739,8 @@ mod tests { let mut overlay = prepare_overlay_with_changes(); let mut offchain_overlay = prepare_offchain_overlay_with_changes(); let mut cache = StorageTransactionCache::default(); - overlay.prospective.top.get_mut(&vec![1]).unwrap().value = None; + overlay.set_collect_extrinsics(false); + overlay.set_storage(vec![1], None); let storage = TestChangesTrieStorage::with_blocks(vec![(99, Default::default())]); let state = Some(ChangesTrieState::new(changes_trie_config(), Zero::zero(), &storage)); let backend = TestBackend::default(); diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index e9367cbec5..3a54ef08f3 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -28,7 +28,6 @@ use sp_core::{ storage::ChildInfo, NativeOrEncoded, NeverNativeValue, hexdisplay::HexDisplay, traits::{CodeExecutor, CallInWasmExt, RuntimeCode}, }; -use overlayed_changes::OverlayedChangeSet; use sp_externalities::Extensions; pub mod backend; @@ -336,7 +335,6 @@ impl<'a, B, H, N, Exec> StateMachine<'a, B, H, N, Exec> where fn execute_call_with_both_strategy( &mut self, mut native_call: Option, - orig_prospective: OverlayedChangeSet, on_consensus_failure: Handler, ) -> CallResult where @@ -347,10 +345,11 @@ impl<'a, B, H, N, Exec> StateMachine<'a, B, H, N, Exec> where CallResult, ) -> CallResult { + let pending_changes = self.overlay.clone_pending(); let (result, was_native) = self.execute_aux(true, native_call.take()); if was_native { - self.overlay.prospective = orig_prospective.clone(); + self.overlay.replace_pending(pending_changes); let (wasm_result, _) = self.execute_aux( false, native_call, @@ -372,12 +371,12 @@ impl<'a, B, H, N, Exec> StateMachine<'a, B, H, N, Exec> where fn execute_call_with_native_else_wasm_strategy( &mut self, mut native_call: Option, - orig_prospective: OverlayedChangeSet, ) -> CallResult where R: Decode + Encode + PartialEq, NC: FnOnce() -> result::Result + UnwindSafe, { + let pending_changes = self.overlay.clone_pending(); let (result, was_native) = self.execute_aux( true, native_call.take(), @@ -386,7 +385,7 @@ impl<'a, B, H, N, Exec> StateMachine<'a, B, H, N, Exec> where if !was_native || result.is_ok() { result } else { - self.overlay.prospective = orig_prospective.clone(); + self.overlay.replace_pending(pending_changes); let (wasm_result, _) = self.execute_aux( false, native_call, @@ -421,20 +420,16 @@ impl<'a, B, H, N, Exec> StateMachine<'a, B, H, N, Exec> where self.overlay.set_collect_extrinsics(changes_tries_enabled); let result = { - let orig_prospective = self.overlay.prospective.clone(); - match manager { ExecutionManager::Both(on_consensus_failure) => { self.execute_call_with_both_strategy( native_call.take(), - orig_prospective, on_consensus_failure, ) }, ExecutionManager::NativeElseWasm => { self.execute_call_with_native_else_wasm_strategy( native_call.take(), - orig_prospective, ) }, ExecutionManager::AlwaysWasm(trust_level) => { @@ -754,7 +749,6 @@ where mod tests { use std::collections::BTreeMap; use codec::Encode; - use overlayed_changes::OverlayedValue; use super::*; use super::ext::Ext; use super::changes_trie::Configuration as ChangesTrieConfig; @@ -977,21 +971,16 @@ mod tests { ]; let mut state = InMemoryBackend::::from(initial); let backend = state.as_trie_backend().unwrap(); - let mut overlay = OverlayedChanges { - committed: map![ - b"aba".to_vec() => OverlayedValue::from(Some(b"1312".to_vec())), - b"bab".to_vec() => OverlayedValue::from(Some(b"228".to_vec())) - ], - prospective: map![ - b"abd".to_vec() => OverlayedValue::from(Some(b"69".to_vec())), - b"bbd".to_vec() => OverlayedValue::from(Some(b"42".to_vec())) - ], - ..Default::default() - }; - let mut offchain_overlay = Default::default(); + let mut overlay = OverlayedChanges::default(); + overlay.set_storage(b"aba".to_vec(), Some(b"1312".to_vec())); + overlay.set_storage(b"bab".to_vec(), Some(b"228".to_vec())); + overlay.commit_prospective(); + overlay.set_storage(b"abd".to_vec(), Some(b"69".to_vec())); + overlay.set_storage(b"bbd".to_vec(), Some(b"42".to_vec())); { + let mut offchain_overlay = Default::default(); let mut cache = StorageTransactionCache::default(); let mut ext = Ext::new( &mut overlay, @@ -1006,7 +995,8 @@ mod tests { overlay.commit_prospective(); assert_eq!( - overlay.committed, + overlay.changes(None).map(|(k, v)| (k.clone(), v.value().cloned())) + .collect::>(), map![ b"abc".to_vec() => None.into(), b"abb".to_vec() => None.into(), diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index 55d4e8db88..2da063c96e 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -30,7 +30,7 @@ use crate::{ use std::iter::FromIterator; use std::collections::{HashMap, BTreeMap, BTreeSet}; use codec::{Decode, Encode}; -use sp_core::storage::{well_known_keys::EXTRINSIC_INDEX, ChildInfo}; +use sp_core::storage::{well_known_keys::EXTRINSIC_INDEX, ChildInfo, ChildType}; use sp_core::offchain::storage::OffchainOverlayedChanges; use std::{mem, ops}; @@ -55,13 +55,13 @@ pub type ChildStorageCollection = Vec<(StorageKey, StorageCollection)>; #[derive(Debug, Default, Clone)] pub struct OverlayedChanges { /// Changes that are not yet committed. - pub(crate) prospective: OverlayedChangeSet, + prospective: OverlayedChangeSet, /// Committed changes. - pub(crate) committed: OverlayedChangeSet, + committed: OverlayedChangeSet, /// True if extrinsics stats must be collected. - pub(crate) collect_extrinsics: bool, + collect_extrinsics: bool, /// Collect statistic on this execution. - pub(crate) stats: StateMachineStats, + stats: StateMachineStats, } /// The storage value, used inside OverlayedChanges. @@ -69,10 +69,10 @@ pub struct OverlayedChanges { #[cfg_attr(test, derive(PartialEq))] pub struct OverlayedValue { /// Current value. None if value has been deleted. - pub value: Option, + value: Option, /// The set of extrinsic indices where the values has been changed. /// Is filled only if runtime has announced changes trie support. - pub extrinsics: Option>, + extrinsics: Option>, } /// Prospective or committed overlayed change set. @@ -80,9 +80,9 @@ pub struct OverlayedValue { #[cfg_attr(test, derive(PartialEq))] pub struct OverlayedChangeSet { /// Top level storage changes. - pub top: BTreeMap, + top: BTreeMap, /// Child storage changes. The map key is the child storage key without the common prefix. - pub children_default: HashMap, ChildInfo)>, + children_default: HashMap, ChildInfo)>, } /// A storage changes structure that can be generated by the data collected in [`OverlayedChanges`]. @@ -187,6 +187,18 @@ impl FromIterator<(StorageKey, OverlayedValue)> for OverlayedChangeSet { } } +impl OverlayedValue { + /// The most recent value contained in this overlay. + pub fn value(&self) -> Option<&StorageValue> { + self.value.as_ref() + } + + /// List of indices of extrinsics which modified the value using this overlay. + pub fn extrinsics(&self) -> Option> { + self.extrinsics.as_ref().map(|v| v.iter()) + } +} + impl OverlayedChangeSet { /// Whether the change set is empty. pub fn is_empty(&self) -> bool { @@ -499,6 +511,44 @@ impl OverlayedChanges { ) } + /// Get an iterator over all pending and committed child tries in the overlay. + pub fn child_infos(&self) -> impl IntoIterator { + self.committed.children_default.iter() + .chain(self.prospective.children_default.iter()) + .map(|(_, v)| &v.1).collect::>() + } + + /// Get an iterator over all pending and committed changes. + /// + /// Supplying `None` for `child_info` will only return changes that are in the top + /// trie. Specifying some `child_info` will return only the changes in that + /// child trie. + pub fn changes(&self, child_info: Option<&ChildInfo>) + -> impl Iterator + { + let (committed, prospective) = if let Some(child_info) = child_info { + match child_info.child_type() { + ChildType::ParentKeyId => ( + self.committed.children_default.get(child_info.storage_key()).map(|c| &c.0), + self.prospective.children_default.get(child_info.storage_key()).map(|c| &c.0), + ), + } + } else { + (Some(&self.committed.top), Some(&self.prospective.top)) + }; + committed.into_iter().flatten().chain(prospective.into_iter().flatten()) + } + + /// Return a clone of the currently pending changes. + pub fn clone_pending(&self) -> OverlayedChangeSet { + self.prospective.clone() + } + + /// Replace the currently pending changes. + pub fn replace_pending(&mut self, pending: OverlayedChangeSet) { + self.prospective = pending; + } + /// Convert this instance with all changes into a [`StorageChanges`] instance. pub fn into_storage_changes< B: Backend, H: Hasher, N: BlockNumber diff --git a/primitives/state-machine/src/testing.rs b/primitives/state-machine/src/testing.rs index 47108b884a..71124a68bb 100644 --- a/primitives/state-machine/src/testing.rs +++ b/primitives/state-machine/src/testing.rs @@ -136,21 +136,19 @@ impl TestExternalities /// Return a new backend with all pending value. pub fn commit_all(&self) -> InMemoryBackend { - let top: Vec<_> = self.overlay.committed.top.clone().into_iter() - .chain(self.overlay.prospective.top.clone().into_iter()) - .map(|(k, v)| (k, v.value)).collect(); + let top: Vec<_> = self.overlay.changes(None) + .map(|(k, v)| (k.clone(), v.value().cloned())) + .collect(); let mut transaction = vec![(None, top)]; - self.overlay.committed.children_default.clone().into_iter() - .chain(self.overlay.prospective.children_default.clone().into_iter()) - .for_each(|(_storage_key, (map, child_info))| { - transaction.push(( - Some(child_info), - map.into_iter() - .map(|(k, v)| (k, v.value)) - .collect::>(), - )) - }); + for child_info in self.overlay.child_infos() { + transaction.push(( + Some(child_info.clone()), + self.overlay.changes(Some(child_info)) + .map(|(k, v)| (k.clone(), v.value().cloned())) + .collect(), + )) + } self.backend.update(transaction) } -- GitLab From 4269e2308eca48a90e724890c900f0421b667fcc Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Wed, 20 May 2020 11:43:33 +0200 Subject: [PATCH 083/150] Bump wasmtime version (#6081) --- Cargo.lock | 16 ++++++++-------- client/executor/wasmtime/Cargo.toml | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 336bc936f8..42a3c10cbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8303,9 +8303,9 @@ version = "1.0.6" [[package]] name = "substrate-wasmtime" -version = "0.16.0-threadsafe.3" +version = "0.16.0-threadsafe.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b0d8eca5d0186e98c8d13399423853e2356b593e028b53e43b2aa35e9105a82" +checksum = "6bd62264edc1a5f3ef44d86fb0c11c9fb142894b9a2da034f34afae482080d7a" dependencies = [ "anyhow", "backtrace", @@ -8326,9 +8326,9 @@ dependencies = [ [[package]] name = "substrate-wasmtime-jit" -version = "0.16.0-threadsafe.3" +version = "0.16.0-threadsafe.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e95772b1778186e4f5c9ae9148bab9911cddf563805a403dee418780e2ed14b4" +checksum = "4ce43c159d4f3ef6b19641e1ae045847fd202d8e2cc74df7ccb2b6475e069d4a" dependencies = [ "anyhow", "cfg-if", @@ -8353,9 +8353,9 @@ dependencies = [ [[package]] name = "substrate-wasmtime-profiling" -version = "0.16.0-threadsafe.3" +version = "0.16.0-threadsafe.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f8a0bf9ca20bee7d83338470247a3f1823158382ebd51fadefcc986e0a6c3de" +checksum = "c77f0ce539b5a09a54dc80a1cf0c7cd7e694df11029354fe50a2d5fe889bdb97" dependencies = [ "anyhow", "cfg-if", @@ -8372,9 +8372,9 @@ dependencies = [ [[package]] name = "substrate-wasmtime-runtime" -version = "0.16.0-threadsafe.3" +version = "0.16.0-threadsafe.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a559895fe1efab16d1c490199225ae35c153ed432ef87ebc177fb37edbd20c7c" +checksum = "46516af0a64a7d9b652c5aa7436b6ce13edfa54435a66ef177fc02d2283e2dc2" dependencies = [ "backtrace", "cc", diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index f7f236cb6b..e7f19a6c1b 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -21,8 +21,8 @@ sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-in sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } -wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.3" } -wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.3" } +wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.4" } +wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.4" } wasmtime-environ = "0.16" cranelift-wasm = "0.63" cranelift-codegen = "0.63" -- GitLab From a67dcfb281ee54f3bd9a4fc217134d7f7da0e9ee Mon Sep 17 00:00:00 2001 From: Dmitry Kashitsyn Date: Wed, 20 May 2020 17:28:13 +0700 Subject: [PATCH 084/150] Refactor resource and error handling in wasm (#6074) * Refactor resource and error handling in wasm * Fixes based on review --- client/executor/common/src/sandbox.rs | 35 ++++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index d897ef583c..37860474cb 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -237,21 +237,33 @@ impl<'a, FE: SandboxCapabilities + 'a> Externals for GuestExternals<'a, FE> { .supervisor_externals .allocate_memory(invoke_args_len) .map_err(|_| trap("Can't allocate memory in supervisor for the arguments"))?; - self + + let deallocate = |this: &mut GuestExternals, ptr, fail_msg| { + this + .supervisor_externals + .deallocate_memory(ptr) + .map_err(|_| trap(fail_msg)) + }; + + if self .supervisor_externals .write_memory(invoke_args_ptr, &invoke_args_data) - .map_err(|_| trap("Can't write invoke args into memory"))?; + .is_err() + { + deallocate(self, invoke_args_ptr, "Failed dealloction after failed write of invoke arguments")?; + return Err(trap("Can't write invoke args into memory")); + } + let result = self.supervisor_externals.invoke( &self.sandbox_instance.dispatch_thunk, invoke_args_ptr, invoke_args_len, state, func_idx, - )?; - self - .supervisor_externals - .deallocate_memory(invoke_args_ptr) - .map_err(|_| trap("Can't deallocate memory for dispatch thunk's invoke arguments"))?; + ); + + deallocate(self, invoke_args_ptr, "Can't deallocate memory for dispatch thunk's invoke arguments")?; + let result = result?; // dispatch_thunk returns pointer to serialized arguments. // Unpack pointer and len of the serialized result data. @@ -265,12 +277,11 @@ impl<'a, FE: SandboxCapabilities + 'a> Externals for GuestExternals<'a, FE> { let serialized_result_val = self.supervisor_externals .read_memory(serialized_result_val_ptr, serialized_result_val_len) - .map_err(|_| trap("Can't read the serialized result from dispatch thunk"))?; - self.supervisor_externals - .deallocate_memory(serialized_result_val_ptr) - .map_err(|_| trap("Can't deallocate memory for dispatch thunk's result"))?; + .map_err(|_| trap("Can't read the serialized result from dispatch thunk")); - deserialize_result(&serialized_result_val) + deallocate(self, serialized_result_val_ptr, "Can't deallocate memory for dispatch thunk's result") + .and_then(|_| serialized_result_val) + .and_then(|serialized_result_val| deserialize_result(&serialized_result_val)) } } -- GitLab From 899a44864900cb691c99f7421bc85e4118bca93d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 20 May 2020 15:05:16 +0200 Subject: [PATCH 085/150] Maximum extrinsic weight limit (#6067) * Only check single extrinsics weight limit in validate_transaction. * Add missing parameter to all pallets. * Add tests, fix default configuration. * Bump spec version. * Use AvailableBlockRation to calculate MaxExtrinsicWeight --- .../pallets/template/src/mock.rs | 1 + bin/node-template/runtime/src/lib.rs | 8 ++ bin/node/runtime/src/lib.rs | 10 ++- frame/assets/src/lib.rs | 1 + frame/aura/src/mock.rs | 1 + frame/authority-discovery/src/lib.rs | 1 + frame/authorship/src/lib.rs | 1 + frame/babe/src/mock.rs | 1 + frame/balances/src/lib.rs | 1 + frame/balances/src/tests_composite.rs | 1 + frame/balances/src/tests_local.rs | 1 + frame/benchmarking/src/tests.rs | 1 + frame/collective/src/lib.rs | 1 + frame/contracts/src/tests.rs | 1 + frame/democracy/src/tests.rs | 1 + frame/elections-phragmen/src/lib.rs | 1 + frame/elections/src/mock.rs | 1 + frame/example-offchain-worker/src/tests.rs | 1 + frame/example/src/lib.rs | 1 + frame/executive/src/lib.rs | 1 + frame/finality-tracker/src/lib.rs | 1 + frame/generic-asset/src/lib.rs | 1 + frame/generic-asset/src/mock.rs | 1 + frame/grandpa/src/mock.rs | 1 + frame/identity/src/lib.rs | 1 + frame/im-online/src/mock.rs | 1 + frame/indices/src/mock.rs | 1 + frame/membership/src/lib.rs | 1 + frame/nicks/src/lib.rs | 1 + frame/offences/benchmarking/src/mock.rs | 1 + frame/offences/src/mock.rs | 1 + frame/randomness-collective-flip/src/lib.rs | 1 + frame/recovery/src/mock.rs | 1 + frame/scheduler/src/lib.rs | 1 + frame/scored-pool/src/mock.rs | 1 + frame/session/benchmarking/src/mock.rs | 1 + frame/session/src/mock.rs | 1 + frame/society/src/mock.rs | 1 + frame/staking/fuzzer/src/mock.rs | 1 + frame/staking/src/mock.rs | 1 + frame/sudo/src/mock.rs | 1 + frame/system/benches/bench.rs | 1 + frame/system/benchmarking/src/mock.rs | 1 + frame/system/src/lib.rs | 77 ++++++++++++++++--- frame/timestamp/src/lib.rs | 1 + frame/transaction-payment/src/lib.rs | 1 + frame/treasury/src/tests.rs | 1 + frame/utility/src/tests.rs | 1 + frame/vesting/src/lib.rs | 1 + test-utils/runtime/src/lib.rs | 1 + 50 files changed, 129 insertions(+), 13 deletions(-) diff --git a/bin/node-template/pallets/template/src/mock.rs b/bin/node-template/pallets/template/src/mock.rs index 33c66e2a4e..4eed0e1e75 100644 --- a/bin/node-template/pallets/template/src/mock.rs +++ b/bin/node-template/pallets/template/src/mock.rs @@ -39,6 +39,7 @@ impl system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index b1b73f3b49..2037f7bb77 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -16,6 +16,7 @@ use sp_runtime::{ }; use sp_runtime::traits::{ BlakeTwo256, Block as BlockT, IdentityLookup, Verify, ConvertInto, IdentifyAccount, NumberFor, + Saturating, }; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -127,6 +128,9 @@ parameter_types! { /// We allow for 2 seconds of compute with a 6 second average block time. pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + /// Assume 10% of weight for average on_initialize calls. + pub const MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() + .saturating_sub(Perbill::from_percent(10)) * MaximumBlockWeight::get(); pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; pub const Version: RuntimeVersion = VERSION; } @@ -164,6 +168,10 @@ impl system::Trait for Runtime { /// The base weight of any extrinsic processed by the runtime, independent of the /// logic of that extrinsic. (Signature verification, nonce increment, fee, etc...) type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + /// The maximum weight that a single extrinsic of `Normal` dispatch class can have, + /// idependent of the logic of that extrinsics. (Roughly max block weight - average on + /// initialize cost). + type MaximumExtrinsicWeight = MaximumExtrinsicWeight; /// Maximum size of all encoded transactions (in bytes) that are allowed in one block. type MaximumBlockLength = MaximumBlockLength; /// Portion of the block weight that is available to all normal transactions. diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index bc44bee8db..834aabbef8 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -47,7 +47,7 @@ use sp_runtime::curve::PiecewiseLinear; use sp_runtime::transaction_validity::{TransactionValidity, TransactionSource, TransactionPriority}; use sp_runtime::traits::{ self, BlakeTwo256, Block as BlockT, StaticLookup, SaturatedConversion, - ConvertInto, OpaqueKeys, NumberFor, + ConvertInto, OpaqueKeys, NumberFor, Saturating, }; use sp_version::RuntimeVersion; #[cfg(any(feature = "std", test))] @@ -94,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 249, - impl_version: 1, + impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; @@ -130,9 +130,12 @@ parameter_types! { pub const BlockHashCount: BlockNumber = 2400; /// We allow for 2 seconds of compute with a 6 second average block time. pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; + pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); + /// Assume 10% of weight for average on_initialize calls. + pub const MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() + .saturating_sub(Perbill::from_percent(10)) * MaximumBlockWeight::get(); pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; pub const Version: RuntimeVersion = VERSION; - pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); } impl frame_system::Trait for Runtime { @@ -151,6 +154,7 @@ impl frame_system::Trait for Runtime { type DbWeight = RocksDbWeight; type BlockExecutionWeight = BlockExecutionWeight; type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + type MaximumExtrinsicWeight = MaximumExtrinsicWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = Version; diff --git a/frame/assets/src/lib.rs b/frame/assets/src/lib.rs index 6211694c94..48806e30cd 100644 --- a/frame/assets/src/lib.rs +++ b/frame/assets/src/lib.rs @@ -317,6 +317,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/aura/src/mock.rs b/frame/aura/src/mock.rs index db4448bdef..84d895cd06 100644 --- a/frame/aura/src/mock.rs +++ b/frame/aura/src/mock.rs @@ -61,6 +61,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index 022ce36281..1b7915ce3a 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -158,6 +158,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index 7605e78097..b9b30bf411 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -433,6 +433,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/babe/src/mock.rs b/frame/babe/src/mock.rs index bdeb284887..de00928171 100644 --- a/frame/babe/src/mock.rs +++ b/frame/babe/src/mock.rs @@ -73,6 +73,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type ModuleToIndex = (); diff --git a/frame/balances/src/lib.rs b/frame/balances/src/lib.rs index d10909b739..d5f9aab37b 100644 --- a/frame/balances/src/lib.rs +++ b/frame/balances/src/lib.rs @@ -863,6 +863,7 @@ impl, I: Instance> frame_system::Trait for ElevatedTrait { type DbWeight = T::DbWeight; type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = T::MaximumBlockWeight; type MaximumBlockLength = T::MaximumBlockLength; type AvailableBlockRatio = T::AvailableBlockRatio; type Version = T::Version; diff --git a/frame/balances/src/tests_composite.rs b/frame/balances/src/tests_composite.rs index e78171376c..78cdc3838b 100644 --- a/frame/balances/src/tests_composite.rs +++ b/frame/balances/src/tests_composite.rs @@ -71,6 +71,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/balances/src/tests_local.rs b/frame/balances/src/tests_local.rs index 736afe9cba..4b0700748c 100644 --- a/frame/balances/src/tests_local.rs +++ b/frame/balances/src/tests_local.rs @@ -71,6 +71,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/benchmarking/src/tests.rs b/frame/benchmarking/src/tests.rs index 8418cb9081..dc9d160b5e 100644 --- a/frame/benchmarking/src/tests.rs +++ b/frame/benchmarking/src/tests.rs @@ -82,6 +82,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = (); type MaximumBlockLength = (); type AvailableBlockRatio = (); type Version = (); diff --git a/frame/collective/src/lib.rs b/frame/collective/src/lib.rs index 132320c7a3..3d6e41d98d 100644 --- a/frame/collective/src/lib.rs +++ b/frame/collective/src/lib.rs @@ -984,6 +984,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 218a5c9937..4dfaa8035f 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -103,6 +103,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index d46214a169..d039f3382f 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -100,6 +100,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 4e2ae09afa..0c35283e1a 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -1087,6 +1087,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/elections/src/mock.rs b/frame/elections/src/mock.rs index c433f8d036..9971dac572 100644 --- a/frame/elections/src/mock.rs +++ b/frame/elections/src/mock.rs @@ -54,6 +54,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/example-offchain-worker/src/tests.rs b/frame/example-offchain-worker/src/tests.rs index d94a989067..30c9c22593 100644 --- a/frame/example-offchain-worker/src/tests.rs +++ b/frame/example-offchain-worker/src/tests.rs @@ -69,6 +69,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 23f21e30dc..6b3d6b5e5f 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -754,6 +754,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 499fd3ebdf..9ac323828d 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -560,6 +560,7 @@ mod tests { type DbWeight = DbWeight; type BlockExecutionWeight = BlockExecutionWeight; type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = RuntimeVersion; diff --git a/frame/finality-tracker/src/lib.rs b/frame/finality-tracker/src/lib.rs index e5065cd917..a9cf9c2b70 100644 --- a/frame/finality-tracker/src/lib.rs +++ b/frame/finality-tracker/src/lib.rs @@ -267,6 +267,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index f2507669e5..646e217366 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -1127,6 +1127,7 @@ impl frame_system::Trait for ElevatedTrait { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = T::MaximumBlockWeight; type MaximumBlockLength = T::MaximumBlockLength; type AvailableBlockRatio = T::AvailableBlockRatio; type Version = T::Version; diff --git a/frame/generic-asset/src/mock.rs b/frame/generic-asset/src/mock.rs index 3e3bd892d5..04fd565091 100644 --- a/frame/generic-asset/src/mock.rs +++ b/frame/generic-asset/src/mock.rs @@ -60,6 +60,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type BlockHashCount = BlockHashCount; diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index 13608db42a..2b9b25eee6 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -109,6 +109,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 37ed8f8672..6a69797c90 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -1189,6 +1189,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/im-online/src/mock.rs b/frame/im-online/src/mock.rs index 9d67e78eef..01e84102b1 100644 --- a/frame/im-online/src/mock.rs +++ b/frame/im-online/src/mock.rs @@ -119,6 +119,7 @@ impl frame_system::Trait for Runtime { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/indices/src/mock.rs b/frame/indices/src/mock.rs index 62f6c93cae..90ac1ae81b 100644 --- a/frame/indices/src/mock.rs +++ b/frame/indices/src/mock.rs @@ -65,6 +65,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 9dd1c8ecfc..29c42f990c 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -318,6 +318,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 205544cdd2..11b23443d6 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -285,6 +285,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/offences/benchmarking/src/mock.rs b/frame/offences/benchmarking/src/mock.rs index 76cd017690..fa6e247abd 100644 --- a/frame/offences/benchmarking/src/mock.rs +++ b/frame/offences/benchmarking/src/mock.rs @@ -57,6 +57,7 @@ impl frame_system::Trait for Test { type OnKilledAccount = (Balances,); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = (); } parameter_types! { pub const ExistentialDeposit: Balance = 10; diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index 3a407654a2..0f5036edc5 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -104,6 +104,7 @@ impl frame_system::Trait for Runtime { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/randomness-collective-flip/src/lib.rs b/frame/randomness-collective-flip/src/lib.rs index 16f54fbc44..4a851c926f 100644 --- a/frame/randomness-collective-flip/src/lib.rs +++ b/frame/randomness-collective-flip/src/lib.rs @@ -173,6 +173,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/recovery/src/mock.rs b/frame/recovery/src/mock.rs index 6345eac5a0..aae9b2b75c 100644 --- a/frame/recovery/src/mock.rs +++ b/frame/recovery/src/mock.rs @@ -79,6 +79,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/scheduler/src/lib.rs b/frame/scheduler/src/lib.rs index 08f53cc592..4fefe12a8e 100644 --- a/frame/scheduler/src/lib.rs +++ b/frame/scheduler/src/lib.rs @@ -502,6 +502,7 @@ mod tests { type DbWeight = RocksDbWeight; type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index aae86973a9..1b61bb1884 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -70,6 +70,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/session/benchmarking/src/mock.rs b/frame/session/benchmarking/src/mock.rs index 9ec017cf22..5c0e40096e 100644 --- a/frame/session/benchmarking/src/mock.rs +++ b/frame/session/benchmarking/src/mock.rs @@ -73,6 +73,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = (); type AvailableBlockRatio = (); type MaximumBlockLength = (); type Version = (); diff --git a/frame/session/src/mock.rs b/frame/session/src/mock.rs index 30fb35b282..e7a9896064 100644 --- a/frame/session/src/mock.rs +++ b/frame/session/src/mock.rs @@ -188,6 +188,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index 3b5cb550a4..7ddd25ee6a 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -80,6 +80,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/staking/fuzzer/src/mock.rs b/frame/staking/fuzzer/src/mock.rs index b1e7ed273c..0e3b6cb13f 100644 --- a/frame/staking/fuzzer/src/mock.rs +++ b/frame/staking/fuzzer/src/mock.rs @@ -61,6 +61,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = (); type Index = AccountIndex; type BlockNumber = BlockNumber; type Call = Call; diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index a2d53f6895..094ab6375c 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -215,6 +215,7 @@ impl frame_system::Trait for Test { type DbWeight = RocksDbWeight; type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/sudo/src/mock.rs b/frame/sudo/src/mock.rs index e853a29f39..a270787da6 100644 --- a/frame/sudo/src/mock.rs +++ b/frame/sudo/src/mock.rs @@ -136,6 +136,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/system/benches/bench.rs b/frame/system/benches/bench.rs index 6c25e5d1c9..95b9b88c70 100644 --- a/frame/system/benches/bench.rs +++ b/frame/system/benches/bench.rs @@ -76,6 +76,7 @@ impl system::Trait for Runtime { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/system/benchmarking/src/mock.rs b/frame/system/benchmarking/src/mock.rs index ed65f4df93..1e904302e3 100644 --- a/frame/system/benchmarking/src/mock.rs +++ b/frame/system/benchmarking/src/mock.rs @@ -66,6 +66,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = (); type AvailableBlockRatio = (); type MaximumBlockLength = (); type Version = (); diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 80bb03c963..746e6536ea 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -212,6 +212,11 @@ pub trait Trait: 'static + Eq + Clone { /// The base weight of an Extrinsic in the block, independent of the of extrinsic being executed. type ExtrinsicBaseWeight: Get; + /// The maximal weight of a single Extrinsic. This should be set to at most + /// `MaximumBlockWeight - AverageOnInitializeWeight`. The limit only applies to extrinsics + /// containing `Normal` dispatch class calls. + type MaximumExtrinsicWeight: Get; + /// The maximum length of a block (in bytes). type MaximumBlockLength: Get; @@ -1352,10 +1357,29 @@ impl CheckWeight where } } + /// Checks if the current extrinsic does not exceed `MaximumExtrinsicWeight` limit. + fn check_extrinsic_weight( + info: &DispatchInfoOf, + ) -> Result<(), TransactionValidityError> { + match info.class { + // Mandatory and Operational transactions does not + DispatchClass::Mandatory | DispatchClass::Operational => Ok(()), + DispatchClass::Normal => { + let maximum_weight = T::MaximumExtrinsicWeight::get(); + let extrinsic_weight = info.weight.saturating_add(T::ExtrinsicBaseWeight::get()); + if extrinsic_weight > maximum_weight { + Err(InvalidTransaction::ExhaustsResources.into()) + } else { + Ok(()) + } + } + } + } + /// Checks if the current extrinsic can fit into the block with respect to block weight limits. /// /// Upon successes, it returns the new block weight as a `Result`. - fn check_weight( + fn check_block_weight( info: &DispatchInfoOf, ) -> Result { let maximum_weight = T::MaximumBlockWeight::get(); @@ -1446,7 +1470,9 @@ impl CheckWeight where len: usize, ) -> Result<(), TransactionValidityError> { let next_len = Self::check_block_length(info, len)?; - let next_weight = Self::check_weight(info)?; + let next_weight = Self::check_block_weight(info)?; + Self::check_extrinsic_weight(info)?; + AllExtrinsicsLen::put(next_len); AllExtrinsicsWeight::put(next_weight); Ok(()) @@ -1459,9 +1485,12 @@ impl CheckWeight where info: &DispatchInfoOf, len: usize, ) -> TransactionValidity { - // ignore the next weight and length. If they return `Ok`, then it is below the limit. + // ignore the next length. If they return `Ok`, then it is below the limit. let _ = Self::check_block_length(info, len)?; - let _ = Self::check_weight(info)?; + // during validation we skip block limit check. Since the `validate_transaction` + // call runs on an empty block anyway, by this we prevent `on_initialize` weight + // consumption from causing false negatives. + Self::check_extrinsic_weight(info)?; Ok(ValidTransaction { priority: Self::get_priority(info), ..Default::default() }) } @@ -1847,6 +1876,7 @@ pub(crate) mod tests { parameter_types! { pub const BlockHashCount: u64 = 10; pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumExtrinsicWeight: Weight = 768; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); pub const MaximumBlockLength: u32 = 1024; pub const Version: RuntimeVersion = RuntimeVersion { @@ -1905,6 +1935,7 @@ pub(crate) mod tests { type DbWeight = DbWeight; type BlockExecutionWeight = BlockExecutionWeight; type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + type MaximumExtrinsicWeight = MaximumExtrinsicWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = Version; @@ -2344,17 +2375,43 @@ pub(crate) mod tests { #[test] fn mandatory_extrinsic_doesnt_care_about_limits() { + fn check(call: impl FnOnce(&DispatchInfo, usize)) { + new_test_ext().execute_with(|| { + let max = DispatchInfo { + weight: Weight::max_value(), + class: DispatchClass::Mandatory, + ..Default::default() + }; + let len = 0_usize; + + call(&max, len); + }); + } + + check(|max, len| { + assert_ok!(CheckWeight::::do_pre_dispatch(max, len)); + assert_eq!(System::all_extrinsics_weight().total(), Weight::max_value()); + assert!(System::all_extrinsics_weight().total() > ::MaximumBlockWeight::get()); + }); + check(|max, len| { + assert_ok!(CheckWeight::::do_validate(max, len)); + }); + } + + #[test] + fn normal_extrinsic_limited_by_maximum_extrinsic_weight() { new_test_ext().execute_with(|| { let max = DispatchInfo { - weight: Weight::max_value(), - class: DispatchClass::Mandatory, + weight: MaximumExtrinsicWeight::get() + 1, + class: DispatchClass::Normal, ..Default::default() }; let len = 0_usize; - assert_ok!(CheckWeight::::do_pre_dispatch(&max, len)); - assert_eq!(System::all_extrinsics_weight().total(), Weight::max_value()); - assert!(System::all_extrinsics_weight().total() > ::MaximumBlockWeight::get()); + assert_noop!( + CheckWeight::::do_validate(&max, len), + InvalidTransaction::ExhaustsResources + ); }); } @@ -2449,7 +2506,7 @@ pub(crate) mod tests { } #[test] - fn signed_ext_check_weight_priority_works() { + fn signed_ext() { new_test_ext().execute_with(|| { let normal = DispatchInfo { weight: 100, class: DispatchClass::Normal, pays_fee: Pays::Yes }; let op = DispatchInfo { weight: 100, class: DispatchClass::Operational, pays_fee: Pays::Yes }; diff --git a/frame/timestamp/src/lib.rs b/frame/timestamp/src/lib.rs index e886f8079f..6d38919f31 100644 --- a/frame/timestamp/src/lib.rs +++ b/frame/timestamp/src/lib.rs @@ -329,6 +329,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 42004021d6..17fe11db6c 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -380,6 +380,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = ExtrinsicBaseWeight; + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/treasury/src/tests.rs b/frame/treasury/src/tests.rs index 606abf7765..0b68c51a10 100644 --- a/frame/treasury/src/tests.rs +++ b/frame/treasury/src/tests.rs @@ -75,6 +75,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type AvailableBlockRatio = AvailableBlockRatio; type MaximumBlockLength = MaximumBlockLength; type Version = (); diff --git a/frame/utility/src/tests.rs b/frame/utility/src/tests.rs index 7dfc58350d..da4d41e3b7 100644 --- a/frame/utility/src/tests.rs +++ b/frame/utility/src/tests.rs @@ -75,6 +75,7 @@ impl frame_system::Trait for Test { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/frame/vesting/src/lib.rs b/frame/vesting/src/lib.rs index a6748b15ce..371fdca691 100644 --- a/frame/vesting/src/lib.rs +++ b/frame/vesting/src/lib.rs @@ -396,6 +396,7 @@ mod tests { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 5ac5535a87..eaceef2def 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -414,6 +414,7 @@ impl frame_system::Trait for Runtime { type DbWeight = (); type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); + type MaximumExtrinsicWeight = MaximumBlockWeight; type MaximumBlockLength = MaximumBlockLength; type AvailableBlockRatio = AvailableBlockRatio; type Version = (); -- GitLab From 0227ff513a045305efee0d8c2cb6025bcefb69ff Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 20 May 2020 15:08:27 +0200 Subject: [PATCH 086/150] Restore the empty line after the license (#6088) --- client/api/src/call_executor.rs | 1 + client/api/src/cht.rs | 1 + client/api/src/in_mem.rs | 1 + client/api/src/leaves.rs | 1 + client/api/src/notifications.rs | 1 + client/authority-discovery/src/tests.rs | 1 + client/basic-authorship/src/lib.rs | 1 + client/block-builder/src/lib.rs | 1 + client/chain-spec/src/chain_spec.rs | 1 + client/cli/src/commands/build_spec_cmd.rs | 1 + client/cli/src/commands/check_block_cmd.rs | 1 + client/cli/src/commands/export_blocks_cmd.rs | 1 + client/cli/src/commands/export_state_cmd.rs | 1 + client/cli/src/commands/import_blocks_cmd.rs | 1 + client/cli/src/commands/purge_chain_cmd.rs | 1 + client/cli/src/commands/revert_cmd.rs | 1 + client/cli/src/commands/run_cmd.rs | 1 + client/cli/src/config.rs | 1 + client/cli/src/error.rs | 1 + client/cli/src/lib.rs | 1 + client/cli/src/params/database_params.rs | 1 + client/cli/src/params/import_params.rs | 1 + client/cli/src/params/keystore_params.rs | 1 + client/cli/src/params/network_params.rs | 1 + client/cli/src/params/node_key_params.rs | 1 + client/cli/src/params/pruning_params.rs | 1 + client/cli/src/params/shared_params.rs | 1 + client/cli/src/params/transaction_pool_params.rs | 1 + client/cli/src/runner.rs | 1 + client/consensus/aura/src/digests.rs | 1 + client/consensus/babe/rpc/src/lib.rs | 1 + client/consensus/manual-seal/src/error.rs | 1 + client/consensus/manual-seal/src/lib.rs | 1 + client/consensus/pow/src/lib.rs | 1 + client/db/src/bench.rs | 1 + client/db/src/cache/list_cache.rs | 1 + client/db/src/cache/list_entry.rs | 1 + client/db/src/cache/list_storage.rs | 1 + client/db/src/cache/mod.rs | 1 + client/db/src/lib.rs | 1 + client/db/src/light.rs | 1 + client/db/src/offchain.rs | 1 + client/db/src/stats.rs | 1 + client/db/src/utils.rs | 1 + client/executor/common/src/error.rs | 1 + client/executor/common/src/sandbox.rs | 1 + client/executor/common/src/util.rs | 1 + client/executor/src/integration_tests/sandbox.rs | 1 + client/executor/src/lib.rs | 1 + client/executor/src/native_executor.rs | 1 + client/executor/wasmtime/src/imports.rs | 1 + client/executor/wasmtime/src/instance_wrapper.rs | 1 + .../executor/wasmtime/src/instance_wrapper/globals_snapshot.rs | 1 + client/executor/wasmtime/src/state_holder.rs | 1 + client/finality-grandpa/rpc/src/error.rs | 1 + client/finality-grandpa/rpc/src/lib.rs | 1 + client/finality-grandpa/rpc/src/report.rs | 1 + client/finality-grandpa/src/authorities.rs | 1 + client/finality-grandpa/src/communication/mod.rs | 1 + client/finality-grandpa/src/environment.rs | 1 + client/finality-grandpa/src/finality_proof.rs | 1 + client/finality-grandpa/src/import.rs | 1 + client/finality-grandpa/src/justification.rs | 1 + client/finality-grandpa/src/lib.rs | 1 + client/finality-grandpa/src/observer.rs | 1 + client/finality-grandpa/src/tests.rs | 1 + client/finality-grandpa/src/until_imported.rs | 1 + client/finality-grandpa/src/voting_rule.rs | 1 + client/informant/src/lib.rs | 1 + client/network-gossip/src/state_machine.rs | 1 + client/network-gossip/src/validator.rs | 1 + client/network/src/chain.rs | 1 + client/network/src/config.rs | 1 + client/network/src/error.rs | 1 + client/network/src/network_state.rs | 1 + client/network/src/on_demand_layer.rs | 1 + client/network/src/protocol.rs | 1 + client/network/src/protocol/generic_proto/handler/notif_in.rs | 1 + client/network/src/protocol/generic_proto/upgrade/legacy.rs | 1 + client/network/src/protocol/message.rs | 1 + client/network/src/protocol/sync/blocks.rs | 1 + client/network/src/protocol/sync/extra_requests.rs | 1 + client/network/src/schema.rs | 1 + client/network/src/service.rs | 1 + client/network/src/service/out_events.rs | 1 + client/network/src/service/tests.rs | 1 + client/network/src/transport.rs | 1 + client/network/test/src/block_import.rs | 1 + client/network/test/src/sync.rs | 1 + client/peerset/src/lib.rs | 1 + client/peerset/tests/fuzz.rs | 1 + client/rpc-api/src/author/error.rs | 1 + client/rpc-api/src/author/mod.rs | 1 + client/rpc-api/src/chain/mod.rs | 1 + client/rpc-api/src/child_state/mod.rs | 1 + client/rpc-api/src/errors.rs | 1 + client/rpc-api/src/helpers.rs | 1 + client/rpc-api/src/offchain/error.rs | 1 + client/rpc-api/src/offchain/mod.rs | 1 + client/rpc-api/src/policy.rs | 1 + client/rpc-api/src/state/error.rs | 1 + client/rpc-api/src/state/helpers.rs | 1 + client/rpc-api/src/state/mod.rs | 1 + client/rpc-api/src/subscriptions.rs | 1 + client/rpc-api/src/system/error.rs | 1 + client/rpc-api/src/system/helpers.rs | 1 + client/rpc-api/src/system/mod.rs | 1 + client/rpc-servers/src/lib.rs | 1 + client/rpc/src/author/mod.rs | 1 + client/rpc/src/author/tests.rs | 1 + client/rpc/src/chain/mod.rs | 1 + client/rpc/src/chain/tests.rs | 1 + client/rpc/src/lib.rs | 1 + client/rpc/src/metadata.rs | 1 + client/rpc/src/offchain/mod.rs | 1 + client/rpc/src/offchain/tests.rs | 1 + client/rpc/src/state/mod.rs | 1 + client/rpc/src/state/tests.rs | 1 + client/rpc/src/system/mod.rs | 1 + client/rpc/src/system/tests.rs | 1 + client/service/src/builder.rs | 1 + client/service/src/chain_ops.rs | 1 + client/service/src/client/block_rules.rs | 1 + client/service/src/client/call_executor.rs | 1 + client/service/src/client/client.rs | 1 + client/service/src/client/genesis.rs | 1 + client/service/src/client/light/blockchain.rs | 1 + client/service/src/client/light/call_executor.rs | 1 + client/service/src/client/light/fetcher.rs | 1 + client/service/src/client/light/mod.rs | 1 + client/service/src/client/mod.rs | 1 + client/service/src/config.rs | 1 + client/service/src/error.rs | 1 + client/service/src/lib.rs | 1 + client/service/src/metrics.rs | 1 + client/service/test/src/client/db.rs | 3 ++- client/service/test/src/client/mod.rs | 1 + client/service/test/src/lib.rs | 1 + client/state-db/src/lib.rs | 1 + client/state-db/src/noncanonical.rs | 1 + client/state-db/src/pruning.rs | 1 + client/state-db/src/test.rs | 1 + client/telemetry/src/lib.rs | 1 + client/telemetry/src/worker.rs | 1 + client/telemetry/src/worker/node.rs | 1 + client/transaction-pool/graph/benches/basics.rs | 1 + client/transaction-pool/graph/src/base_pool.rs | 1 + client/transaction-pool/graph/src/error.rs | 1 + client/transaction-pool/graph/src/future.rs | 1 + client/transaction-pool/graph/src/lib.rs | 1 + client/transaction-pool/graph/src/listener.rs | 1 + client/transaction-pool/graph/src/pool.rs | 1 + client/transaction-pool/graph/src/ready.rs | 1 + client/transaction-pool/graph/src/rotator.rs | 1 + client/transaction-pool/graph/src/validated_pool.rs | 1 + client/transaction-pool/graph/src/watcher.rs | 1 + client/transaction-pool/src/api.rs | 1 + client/transaction-pool/src/error.rs | 1 + client/transaction-pool/src/lib.rs | 1 + client/transaction-pool/src/metrics.rs | 1 + client/transaction-pool/src/revalidation.rs | 1 + client/transaction-pool/src/testing/mod.rs | 1 + client/transaction-pool/src/testing/pool.rs | 1 + 163 files changed, 164 insertions(+), 1 deletion(-) diff --git a/client/api/src/call_executor.rs b/client/api/src/call_executor.rs index e5b670579a..d9d43900df 100644 --- a/client/api/src/call_executor.rs +++ b/client/api/src/call_executor.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! A method call executor interface. use std::{panic::UnwindSafe, result, cell::RefCell}; diff --git a/client/api/src/cht.rs b/client/api/src/cht.rs index ef282868c9..30cfd3a1b6 100644 --- a/client/api/src/cht.rs +++ b/client/api/src/cht.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Canonical hash trie definitions and helper functions. //! //! Each CHT is a trie mapping block numbers to canonical hash. diff --git a/client/api/src/in_mem.rs b/client/api/src/in_mem.rs index cb1724e468..0eb0681a82 100644 --- a/client/api/src/in_mem.rs +++ b/client/api/src/in_mem.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! In memory client backend use std::collections::HashMap; diff --git a/client/api/src/leaves.rs b/client/api/src/leaves.rs index c93446b94d..25f9f3d29b 100644 --- a/client/api/src/leaves.rs +++ b/client/api/src/leaves.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Helper for managing the set of available leaves in the chain for DB implementations. use std::collections::BTreeMap; diff --git a/client/api/src/notifications.rs b/client/api/src/notifications.rs index c89e8b6dfd..ec63c372c7 100644 --- a/client/api/src/notifications.rs +++ b/client/api/src/notifications.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Storage notifications use std::{ diff --git a/client/authority-discovery/src/tests.rs b/client/authority-discovery/src/tests.rs index 106c68b2d0..12edcf5fc9 100644 --- a/client/authority-discovery/src/tests.rs +++ b/client/authority-discovery/src/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{iter::FromIterator, sync::{Arc, Mutex}}; use futures::channel::mpsc::channel; diff --git a/client/basic-authorship/src/lib.rs b/client/basic-authorship/src/lib.rs index 7c77dde6b0..f5f2c089f6 100644 --- a/client/basic-authorship/src/lib.rs +++ b/client/basic-authorship/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Basic implementation of block-authoring logic. //! //! # Example diff --git a/client/block-builder/src/lib.rs b/client/block-builder/src/lib.rs index f630d42a9b..af40b33662 100644 --- a/client/block-builder/src/lib.rs +++ b/client/block-builder/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate block builder //! //! This crate provides the [`BlockBuilder`] utility and the corresponding runtime api diff --git a/client/chain-spec/src/chain_spec.rs b/client/chain-spec/src/chain_spec.rs index a6bf6212e1..52414f8687 100644 --- a/client/chain-spec/src/chain_spec.rs +++ b/client/chain-spec/src/chain_spec.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate chain configurations. use std::{borrow::Cow, fs::File, path::PathBuf, sync::Arc, collections::HashMap}; diff --git a/client/cli/src/commands/build_spec_cmd.rs b/client/cli/src/commands/build_spec_cmd.rs index e5e7123b4b..2f9e2fa059 100644 --- a/client/cli/src/commands/build_spec_cmd.rs +++ b/client/cli/src/commands/build_spec_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error; use crate::params::NodeKeyParams; use crate::params::SharedParams; diff --git a/client/cli/src/commands/check_block_cmd.rs b/client/cli/src/commands/check_block_cmd.rs index 35f26af667..d1241f010d 100644 --- a/client/cli/src/commands/check_block_cmd.rs +++ b/client/cli/src/commands/check_block_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{ CliConfiguration, error, params::{ImportParams, SharedParams, BlockNumberOrHash}, }; diff --git a/client/cli/src/commands/export_blocks_cmd.rs b/client/cli/src/commands/export_blocks_cmd.rs index 431add4128..2fdc408250 100644 --- a/client/cli/src/commands/export_blocks_cmd.rs +++ b/client/cli/src/commands/export_blocks_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error; use crate::params::{BlockNumber, DatabaseParams, PruningParams, SharedParams}; use crate::CliConfiguration; diff --git a/client/cli/src/commands/export_state_cmd.rs b/client/cli/src/commands/export_state_cmd.rs index ee022e1afd..3ad6772882 100644 --- a/client/cli/src/commands/export_state_cmd.rs +++ b/client/cli/src/commands/export_state_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{ CliConfiguration, error, params::{PruningParams, SharedParams, BlockNumberOrHash}, }; diff --git a/client/cli/src/commands/import_blocks_cmd.rs b/client/cli/src/commands/import_blocks_cmd.rs index 029e447562..e138850c8b 100644 --- a/client/cli/src/commands/import_blocks_cmd.rs +++ b/client/cli/src/commands/import_blocks_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error; use crate::params::ImportParams; use crate::params::SharedParams; diff --git a/client/cli/src/commands/purge_chain_cmd.rs b/client/cli/src/commands/purge_chain_cmd.rs index 6b540a66a2..9d364a45f7 100644 --- a/client/cli/src/commands/purge_chain_cmd.rs +++ b/client/cli/src/commands/purge_chain_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error; use crate::params::{DatabaseParams, SharedParams}; use crate::CliConfiguration; diff --git a/client/cli/src/commands/revert_cmd.rs b/client/cli/src/commands/revert_cmd.rs index ea6ba5ecf7..6117eaf488 100644 --- a/client/cli/src/commands/revert_cmd.rs +++ b/client/cli/src/commands/revert_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error; use crate::params::{BlockNumber, PruningParams, SharedParams}; use crate::CliConfiguration; diff --git a/client/cli/src/commands/run_cmd.rs b/client/cli/src/commands/run_cmd.rs index c34a31e59b..f87d5bea6e 100644 --- a/client/cli/src/commands/run_cmd.rs +++ b/client/cli/src/commands/run_cmd.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::arg_enums::RpcMethods; use crate::error::{Error, Result}; use crate::params::ImportParams; diff --git a/client/cli/src/config.rs b/client/cli/src/config.rs index fb0101ec88..fdaee929a6 100644 --- a/client/cli/src/config.rs +++ b/client/cli/src/config.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Configuration trait for a CLI based on substrate use crate::arg_enums::Database; diff --git a/client/cli/src/error.rs b/client/cli/src/error.rs index fa336974d6..23c2bf05f0 100644 --- a/client/cli/src/error.rs +++ b/client/cli/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Initialization errors. /// Result type alias for the CLI. diff --git a/client/cli/src/lib.rs b/client/cli/src/lib.rs index 271572b43d..36d3649926 100644 --- a/client/cli/src/lib.rs +++ b/client/cli/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate CLI library. #![warn(missing_docs)] diff --git a/client/cli/src/params/database_params.rs b/client/cli/src/params/database_params.rs index 62b0436788..3ff8eb01d0 100644 --- a/client/cli/src/params/database_params.rs +++ b/client/cli/src/params/database_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::arg_enums::Database; use structopt::StructOpt; diff --git a/client/cli/src/params/import_params.rs b/client/cli/src/params/import_params.rs index e1c86aec9b..fb683df6d3 100644 --- a/client/cli/src/params/import_params.rs +++ b/client/cli/src/params/import_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::arg_enums::{ ExecutionStrategy, TracingReceiver, WasmExecutionMethod, DEFAULT_EXECUTION_BLOCK_CONSTRUCTION, DEFAULT_EXECUTION_IMPORT_BLOCK, diff --git a/client/cli/src/params/keystore_params.rs b/client/cli/src/params/keystore_params.rs index 4dbd793456..2fd610377d 100644 --- a/client/cli/src/params/keystore_params.rs +++ b/client/cli/src/params/keystore_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error::Result; use sc_service::config::KeystoreConfig; use std::fs; diff --git a/client/cli/src/params/network_params.rs b/client/cli/src/params/network_params.rs index e328c32a40..c1639ad2b4 100644 --- a/client/cli/src/params/network_params.rs +++ b/client/cli/src/params/network_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::params::node_key_params::NodeKeyParams; use sc_network::{ config::{NetworkConfiguration, NodeKeyConfig, NonReservedPeerMode, TransportConfig}, diff --git a/client/cli/src/params/node_key_params.rs b/client/cli/src/params/node_key_params.rs index ede9fd02e1..7d19971ad6 100644 --- a/client/cli/src/params/node_key_params.rs +++ b/client/cli/src/params/node_key_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use sc_network::config::NodeKeyConfig; use sp_core::H256; use std::{path::PathBuf, str::FromStr}; diff --git a/client/cli/src/params/pruning_params.rs b/client/cli/src/params/pruning_params.rs index d96a44986d..3617935906 100644 --- a/client/cli/src/params/pruning_params.rs +++ b/client/cli/src/params/pruning_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::error; use sc_service::{PruningMode, Role}; use structopt::StructOpt; diff --git a/client/cli/src/params/shared_params.rs b/client/cli/src/params/shared_params.rs index 94fb3ceea6..5bf8102466 100644 --- a/client/cli/src/params/shared_params.rs +++ b/client/cli/src/params/shared_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::path::PathBuf; use structopt::StructOpt; diff --git a/client/cli/src/params/transaction_pool_params.rs b/client/cli/src/params/transaction_pool_params.rs index 00f5f0dbd6..2283c0f39f 100644 --- a/client/cli/src/params/transaction_pool_params.rs +++ b/client/cli/src/params/transaction_pool_params.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use sc_service::config::TransactionPoolOptions; use structopt::StructOpt; diff --git a/client/cli/src/runner.rs b/client/cli/src/runner.rs index 1600aed7d6..2d27743163 100644 --- a/client/cli/src/runner.rs +++ b/client/cli/src/runner.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::CliConfiguration; use crate::Result; use crate::SubstrateCli; diff --git a/client/consensus/aura/src/digests.rs b/client/consensus/aura/src/digests.rs index 8ddcb2bee4..3332e4c6a6 100644 --- a/client/consensus/aura/src/digests.rs +++ b/client/consensus/aura/src/digests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Aura (Authority-Round) digests //! //! This implements the digests for AuRa, to allow the private diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index 0c8a16e4da..925328a856 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! RPC api for babe. use sc_consensus_babe::{Epoch, authorship, Config}; diff --git a/client/consensus/manual-seal/src/error.rs b/client/consensus/manual-seal/src/error.rs index 36499893c3..2411a839b0 100644 --- a/client/consensus/manual-seal/src/error.rs +++ b/client/consensus/manual-seal/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! A manual sealing engine: the engine listens for rpc calls to seal blocks and create forks. //! This is suitable for a testing environment. use sp_consensus::{Error as ConsensusError, ImportResult}; diff --git a/client/consensus/manual-seal/src/lib.rs b/client/consensus/manual-seal/src/lib.rs index de9711b2a8..26f493d5d2 100644 --- a/client/consensus/manual-seal/src/lib.rs +++ b/client/consensus/manual-seal/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! A manual sealing engine: the engine listens for rpc calls to seal blocks and create forks. //! This is suitable for a testing environment. diff --git a/client/consensus/pow/src/lib.rs b/client/consensus/pow/src/lib.rs index b0d1e04348..2628a11d3b 100644 --- a/client/consensus/pow/src/lib.rs +++ b/client/consensus/pow/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Proof of work consensus for Substrate. //! //! To use this engine, you can need to have a struct that implements diff --git a/client/db/src/bench.rs b/client/db/src/bench.rs index 3b31a37b14..807e8c68e1 100644 --- a/client/db/src/bench.rs +++ b/client/db/src/bench.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! State backend that's useful for benchmarking use std::sync::Arc; diff --git a/client/db/src/cache/list_cache.rs b/client/db/src/cache/list_cache.rs index a2af053e87..0856350fb0 100644 --- a/client/db/src/cache/list_cache.rs +++ b/client/db/src/cache/list_cache.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! List-based cache. //! //! Maintains several lists, containing nodes that are inserted whenever diff --git a/client/db/src/cache/list_entry.rs b/client/db/src/cache/list_entry.rs index 39dee59d55..565a62cff4 100644 --- a/client/db/src/cache/list_entry.rs +++ b/client/db/src/cache/list_entry.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! List-cache storage entries. use sp_blockchain::Result as ClientResult; diff --git a/client/db/src/cache/list_storage.rs b/client/db/src/cache/list_storage.rs index 1fa26552e9..377d744eff 100644 --- a/client/db/src/cache/list_storage.rs +++ b/client/db/src/cache/list_storage.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! List-cache storage definition and implementation. use std::sync::Arc; diff --git a/client/db/src/cache/mod.rs b/client/db/src/cache/mod.rs index 03cda1b589..2b7cd2e620 100644 --- a/client/db/src/cache/mod.rs +++ b/client/db/src/cache/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! DB-backed cache of blockchain data. use std::{sync::Arc, collections::{HashMap, hash_map::Entry}}; diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 75d36dde5c..037409dfc4 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Client backend that is backed by a database. //! //! # Canonicality vs. Finality diff --git a/client/db/src/light.rs b/client/db/src/light.rs index 8607823462..f115ac9599 100644 --- a/client/db/src/light.rs +++ b/client/db/src/light.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! RocksDB-based light client blockchain storage. use std::{sync::Arc, collections::HashMap}; diff --git a/client/db/src/offchain.rs b/client/db/src/offchain.rs index a7cc1345d1..651510d6e8 100644 --- a/client/db/src/offchain.rs +++ b/client/db/src/offchain.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! RocksDB-based offchain workers local storage. use std::{ diff --git a/client/db/src/stats.rs b/client/db/src/stats.rs index 7a265ddf82..8d208024b4 100644 --- a/client/db/src/stats.rs +++ b/client/db/src/stats.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Database usage statistics use std::sync::atomic::{AtomicU64, Ordering as AtomicOrdering}; diff --git a/client/db/src/utils.rs b/client/db/src/utils.rs index c05a411258..80b08b3a6e 100644 --- a/client/db/src/utils.rs +++ b/client/db/src/utils.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Db-based backend utility structures and functions, used by both //! full and light storages. diff --git a/client/executor/common/src/error.rs b/client/executor/common/src/error.rs index 8fc0c4392c..04850e6f8d 100644 --- a/client/executor/common/src/error.rs +++ b/client/executor/common/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Rust executor possible errors. use sp_serializer; diff --git a/client/executor/common/src/sandbox.rs b/client/executor/common/src/sandbox.rs index 37860474cb..b2c35b7582 100644 --- a/client/executor/common/src/sandbox.rs +++ b/client/executor/common/src/sandbox.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! This module implements sandboxing support in the runtime. //! //! Sandboxing is baked by wasmi at the moment. In future, however, we would like to add/switch to diff --git a/client/executor/common/src/util.rs b/client/executor/common/src/util.rs index ebd14a5a6e..92a48e1401 100644 --- a/client/executor/common/src/util.rs +++ b/client/executor/common/src/util.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! A set of utilities for resetting a wasm instance to its initial state. use crate::error::{self, Error}; diff --git a/client/executor/src/integration_tests/sandbox.rs b/client/executor/src/integration_tests/sandbox.rs index 8fe7678955..f84e446b41 100644 --- a/client/executor/src/integration_tests/sandbox.rs +++ b/client/executor/src/integration_tests/sandbox.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::{TestExternalities, call_in_wasm}; use crate::WasmExecutionMethod; diff --git a/client/executor/src/lib.rs b/client/executor/src/lib.rs index a8b86da714..c02568c734 100644 --- a/client/executor/src/lib.rs +++ b/client/executor/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! A crate that provides means of executing/dispatching calls into the runtime. //! //! There are a few responsibilities of this crate at the moment: diff --git a/client/executor/src/native_executor.rs b/client/executor/src/native_executor.rs index 95f5dff8c6..b1eb504d5a 100644 --- a/client/executor/src/native_executor.rs +++ b/client/executor/src/native_executor.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{ RuntimeInfo, error::{Error, Result}, wasm_runtime::{RuntimeCache, WasmExecutionMethod}, diff --git a/client/executor/wasmtime/src/imports.rs b/client/executor/wasmtime/src/imports.rs index b427606c3c..36752d72fa 100644 --- a/client/executor/wasmtime/src/imports.rs +++ b/client/executor/wasmtime/src/imports.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::state_holder; use sc_executor_common::error::WasmError; use sp_wasm_interface::{Function, Value, ValueType}; diff --git a/client/executor/wasmtime/src/instance_wrapper.rs b/client/executor/wasmtime/src/instance_wrapper.rs index 8b0b5cf382..9026b8054e 100644 --- a/client/executor/wasmtime/src/instance_wrapper.rs +++ b/client/executor/wasmtime/src/instance_wrapper.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Defines data and logic needed for interaction with an WebAssembly instance of a substrate //! runtime module. diff --git a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs index db2cc28e68..01d82451fc 100644 --- a/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs +++ b/client/executor/wasmtime/src/instance_wrapper/globals_snapshot.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::InstanceWrapper; use sc_executor_common::{ error::{Error, Result}, diff --git a/client/executor/wasmtime/src/state_holder.rs b/client/executor/wasmtime/src/state_holder.rs index ac5b64c774..711d3bb735 100644 --- a/client/executor/wasmtime/src/state_holder.rs +++ b/client/executor/wasmtime/src/state_holder.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::host::{HostContext, HostState}; scoped_tls::scoped_thread_local!(static HOST_STATE: HostState); diff --git a/client/finality-grandpa/rpc/src/error.rs b/client/finality-grandpa/rpc/src/error.rs index 73c36f23f5..bfd0596fdf 100644 --- a/client/finality-grandpa/rpc/src/error.rs +++ b/client/finality-grandpa/rpc/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::NOT_READY_ERROR_CODE; #[derive(derive_more::Display, derive_more::From)] diff --git a/client/finality-grandpa/rpc/src/lib.rs b/client/finality-grandpa/rpc/src/lib.rs index 6d8e10622b..1af84b7a84 100644 --- a/client/finality-grandpa/rpc/src/lib.rs +++ b/client/finality-grandpa/rpc/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! RPC API for GRANDPA. #![warn(missing_docs)] diff --git a/client/finality-grandpa/rpc/src/report.rs b/client/finality-grandpa/rpc/src/report.rs index 19b89c5083..a635728cb9 100644 --- a/client/finality-grandpa/rpc/src/report.rs +++ b/client/finality-grandpa/rpc/src/report.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{ collections::{BTreeSet, HashSet}, fmt::Debug, diff --git a/client/finality-grandpa/src/authorities.rs b/client/finality-grandpa/src/authorities.rs index 2105d9ed38..b4cb254864 100644 --- a/client/finality-grandpa/src/authorities.rs +++ b/client/finality-grandpa/src/authorities.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Utilities for dealing with authorities, authority sets, and handoffs. use fork_tree::ForkTree; diff --git a/client/finality-grandpa/src/communication/mod.rs b/client/finality-grandpa/src/communication/mod.rs index 533acb8de6..abd1c27983 100644 --- a/client/finality-grandpa/src/communication/mod.rs +++ b/client/finality-grandpa/src/communication/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Communication streams for the polite-grandpa networking protocol. //! //! GRANDPA nodes communicate over a gossip network, where messages are not sent to diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index 85816b110b..afcc3891ac 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::collections::BTreeMap; use std::iter::FromIterator; use std::pin::Pin; diff --git a/client/finality-grandpa/src/finality_proof.rs b/client/finality-grandpa/src/finality_proof.rs index 82a5220d87..55f6376579 100644 --- a/client/finality-grandpa/src/finality_proof.rs +++ b/client/finality-grandpa/src/finality_proof.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! GRANDPA block finality proof generation and check. //! //! Finality of block B is proved by providing: diff --git a/client/finality-grandpa/src/import.rs b/client/finality-grandpa/src/import.rs index 3f3bcc0d8c..7e3799b1e2 100644 --- a/client/finality-grandpa/src/import.rs +++ b/client/finality-grandpa/src/import.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{sync::Arc, collections::HashMap}; use log::{debug, trace}; diff --git a/client/finality-grandpa/src/justification.rs b/client/finality-grandpa/src/justification.rs index 7f86f7e443..b4db81f8a4 100644 --- a/client/finality-grandpa/src/justification.rs +++ b/client/finality-grandpa/src/justification.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::collections::{HashMap, HashSet}; use std::sync::Arc; diff --git a/client/finality-grandpa/src/lib.rs b/client/finality-grandpa/src/lib.rs index 41dedc2246..7b20d082a0 100644 --- a/client/finality-grandpa/src/lib.rs +++ b/client/finality-grandpa/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Integration of the GRANDPA finality gadget into substrate. //! //! This crate is unstable and the API and usage may change. diff --git a/client/finality-grandpa/src/observer.rs b/client/finality-grandpa/src/observer.rs index ee203a225d..cd678b3bb4 100644 --- a/client/finality-grandpa/src/observer.rs +++ b/client/finality-grandpa/src/observer.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; diff --git a/client/finality-grandpa/src/tests.rs b/client/finality-grandpa/src/tests.rs index dbc54a0d64..25e6253652 100644 --- a/client/finality-grandpa/src/tests.rs +++ b/client/finality-grandpa/src/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Tests and test helpers for GRANDPA. use super::*; diff --git a/client/finality-grandpa/src/until_imported.rs b/client/finality-grandpa/src/until_imported.rs index 6be1a1b1be..6a39c2637e 100644 --- a/client/finality-grandpa/src/until_imported.rs +++ b/client/finality-grandpa/src/until_imported.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Helper stream for waiting until one or more blocks are imported before //! passing through inner items. This is done in a generic way to support //! many different kinds of items. diff --git a/client/finality-grandpa/src/voting_rule.rs b/client/finality-grandpa/src/voting_rule.rs index d0c47037ab..60493867ce 100644 --- a/client/finality-grandpa/src/voting_rule.rs +++ b/client/finality-grandpa/src/voting_rule.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Handling custom voting rules for GRANDPA. //! //! This exposes the `VotingRule` trait used to implement arbitrary voting diff --git a/client/informant/src/lib.rs b/client/informant/src/lib.rs index 891e9c0211..6eea9c1d04 100644 --- a/client/informant/src/lib.rs +++ b/client/informant/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Console informant. Prints sync progress and block events. Runs on the calling thread. use ansi_term::Colour; diff --git a/client/network-gossip/src/state_machine.rs b/client/network-gossip/src/state_machine.rs index 0d8ad50970..da07bde3e7 100644 --- a/client/network-gossip/src/state_machine.rs +++ b/client/network-gossip/src/state_machine.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{Network, MessageIntent, Validator, ValidatorContext, ValidationResult}; use std::collections::{HashMap, HashSet}; diff --git a/client/network-gossip/src/validator.rs b/client/network-gossip/src/validator.rs index cd0a733c91..fd29aaddaf 100644 --- a/client/network-gossip/src/validator.rs +++ b/client/network-gossip/src/validator.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use sc_network::{ObservedRole, PeerId}; use sp_runtime::traits::Block as BlockT; diff --git a/client/network/src/chain.rs b/client/network/src/chain.rs index f79cf6f61e..20fbe02843 100644 --- a/client/network/src/chain.rs +++ b/client/network/src/chain.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Blockchain access trait use sp_blockchain::{Error, HeaderBackend, HeaderMetadata}; diff --git a/client/network/src/config.rs b/client/network/src/config.rs index c1534c6d9c..394e8fc01a 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Configuration of the networking layer. //! //! The [`Params`] struct is the struct that must be passed in order to initialize the networking. diff --git a/client/network/src/error.rs b/client/network/src/error.rs index e46273c47b..fed7a331da 100644 --- a/client/network/src/error.rs +++ b/client/network/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate network possible errors. use libp2p::{PeerId, Multiaddr}; diff --git a/client/network/src/network_state.rs b/client/network/src/network_state.rs index ca6733de81..970a63faed 100644 --- a/client/network/src/network_state.rs +++ b/client/network/src/network_state.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Information about the networking, for diagnostic purposes. //! //! **Warning**: These APIs are not stable. diff --git a/client/network/src/on_demand_layer.rs b/client/network/src/on_demand_layer.rs index c76ebb0351..084172ee57 100644 --- a/client/network/src/on_demand_layer.rs +++ b/client/network/src/on_demand_layer.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! On-demand requests service. use crate::light_client_handler; diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 8a71494d82..b3c08320f9 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{ ExHashT, chain::{Client, FinalityProofProvider}, diff --git a/client/network/src/protocol/generic_proto/handler/notif_in.rs b/client/network/src/protocol/generic_proto/handler/notif_in.rs index 68708b9fb7..ef4644c548 100644 --- a/client/network/src/protocol/generic_proto/handler/notif_in.rs +++ b/client/network/src/protocol/generic_proto/handler/notif_in.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Implementations of the `IntoProtocolsHandler` and `ProtocolsHandler` traits for ingoing //! substreams for a single gossiping protocol. //! diff --git a/client/network/src/protocol/generic_proto/upgrade/legacy.rs b/client/network/src/protocol/generic_proto/upgrade/legacy.rs index aba7fda2c3..13560113bb 100644 --- a/client/network/src/protocol/generic_proto/upgrade/legacy.rs +++ b/client/network/src/protocol/generic_proto/upgrade/legacy.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::config::ProtocolId; use bytes::BytesMut; use futures::prelude::*; diff --git a/client/network/src/protocol/message.rs b/client/network/src/protocol/message.rs index 5baa8ed78f..bb2253b733 100644 --- a/client/network/src/protocol/message.rs +++ b/client/network/src/protocol/message.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Network packet message types. These get serialized and put into the lower level protocol payload. use bitflags::bitflags; diff --git a/client/network/src/protocol/sync/blocks.rs b/client/network/src/protocol/sync/blocks.rs index 8d7e375d08..b64c9e053e 100644 --- a/client/network/src/protocol/sync/blocks.rs +++ b/client/network/src/protocol/sync/blocks.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::cmp; use std::ops::Range; use std::collections::{HashMap, BTreeMap}; diff --git a/client/network/src/protocol/sync/extra_requests.rs b/client/network/src/protocol/sync/extra_requests.rs index 5df77a8228..6d688c130f 100644 --- a/client/network/src/protocol/sync/extra_requests.rs +++ b/client/network/src/protocol/sync/extra_requests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use sp_blockchain::Error as ClientError; use crate::protocol::sync::{PeerSync, PeerSyncState}; use fork_tree::ForkTree; diff --git a/client/network/src/schema.rs b/client/network/src/schema.rs index c736b5c652..44fbbffd25 100644 --- a/client/network/src/schema.rs +++ b/client/network/src/schema.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Include sources generated from protobuf definitions. pub mod v1 { diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 331580ecb4..4a52bfebdd 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Main entry point of the sc-network crate. //! //! There are two main structs in this module: [`NetworkWorker`] and [`NetworkService`]. diff --git a/client/network/src/service/out_events.rs b/client/network/src/service/out_events.rs index 024b974266..4a631601a6 100644 --- a/client/network/src/service/out_events.rs +++ b/client/network/src/service/out_events.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Registering events streams. //! //! This code holds the logic that is used for the network service to inform other parts of diff --git a/client/network/src/service/tests.rs b/client/network/src/service/tests.rs index cd1ac85497..8eaa984492 100644 --- a/client/network/src/service/tests.rs +++ b/client/network/src/service/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{config, Event, NetworkService, NetworkWorker}; use futures::prelude::*; diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 7b42211433..0c9a809384 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use futures::prelude::*; use libp2p::{ InboundUpgradeExt, OutboundUpgradeExt, PeerId, Transport, diff --git a/client/network/test/src/block_import.rs b/client/network/test/src/block_import.rs index 34199abde2..ef6ac9268f 100644 --- a/client/network/test/src/block_import.rs +++ b/client/network/test/src/block_import.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Testing block import logic. use sp_consensus::ImportedAux; diff --git a/client/network/test/src/sync.rs b/client/network/test/src/sync.rs index a87badead7..13d04a8c4e 100644 --- a/client/network/test/src/sync.rs +++ b/client/network/test/src/sync.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use sp_consensus::BlockOrigin; use std::time::Duration; use futures::executor::block_on; diff --git a/client/peerset/src/lib.rs b/client/peerset/src/lib.rs index bde3bf628c..e5e8ec826f 100644 --- a/client/peerset/src/lib.rs +++ b/client/peerset/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Peer Set Manager (PSM). Contains the strategy for choosing which nodes the network should be //! connected to. diff --git a/client/peerset/tests/fuzz.rs b/client/peerset/tests/fuzz.rs index dbc688fd5e..aa2de56923 100644 --- a/client/peerset/tests/fuzz.rs +++ b/client/peerset/tests/fuzz.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use futures::prelude::*; use libp2p::PeerId; use rand::distributions::{Distribution, Uniform, WeightedIndex}; diff --git a/client/rpc-api/src/author/error.rs b/client/rpc-api/src/author/error.rs index 192d0c2795..e6ee36cdce 100644 --- a/client/rpc-api/src/author/error.rs +++ b/client/rpc-api/src/author/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Authoring RPC module errors. use crate::errors; diff --git a/client/rpc-api/src/author/mod.rs b/client/rpc-api/src/author/mod.rs index d99f854037..29f5b1d26e 100644 --- a/client/rpc-api/src/author/mod.rs +++ b/client/rpc-api/src/author/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate block-author/full-node API. pub mod error; diff --git a/client/rpc-api/src/chain/mod.rs b/client/rpc-api/src/chain/mod.rs index 0d394acd0b..a7b26f3024 100644 --- a/client/rpc-api/src/chain/mod.rs +++ b/client/rpc-api/src/chain/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate blockchain API. pub mod error; diff --git a/client/rpc-api/src/child_state/mod.rs b/client/rpc-api/src/child_state/mod.rs index 21045677f4..d956a7554f 100644 --- a/client/rpc-api/src/child_state/mod.rs +++ b/client/rpc-api/src/child_state/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate state API. use jsonrpc_derive::rpc; diff --git a/client/rpc-api/src/errors.rs b/client/rpc-api/src/errors.rs index a0c9c4cfbe..4e1a5b10fc 100644 --- a/client/rpc-api/src/errors.rs +++ b/client/rpc-api/src/errors.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use log::warn; pub fn internal(e: E) -> jsonrpc_core::Error { diff --git a/client/rpc-api/src/helpers.rs b/client/rpc-api/src/helpers.rs index 5ce9161ad5..025fef1102 100644 --- a/client/rpc-api/src/helpers.rs +++ b/client/rpc-api/src/helpers.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use jsonrpc_core::futures::prelude::*; use futures::{channel::oneshot, compat::Compat}; diff --git a/client/rpc-api/src/offchain/error.rs b/client/rpc-api/src/offchain/error.rs index 6e9b531623..ea5223f1ce 100644 --- a/client/rpc-api/src/offchain/error.rs +++ b/client/rpc-api/src/offchain/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Offchain RPC errors. use jsonrpc_core as rpc; diff --git a/client/rpc-api/src/offchain/mod.rs b/client/rpc-api/src/offchain/mod.rs index c456e56a4d..427b6a1cc0 100644 --- a/client/rpc-api/src/offchain/mod.rs +++ b/client/rpc-api/src/offchain/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate offchain API. pub mod error; diff --git a/client/rpc-api/src/policy.rs b/client/rpc-api/src/policy.rs index 3dc3bf8505..e6e3380e1a 100644 --- a/client/rpc-api/src/policy.rs +++ b/client/rpc-api/src/policy.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Policy-related types. //! //! Contains a `DenyUnsafe` type that can be used to deny potentially unsafe diff --git a/client/rpc-api/src/state/error.rs b/client/rpc-api/src/state/error.rs index 2dabe309ee..2fcca3c343 100644 --- a/client/rpc-api/src/state/error.rs +++ b/client/rpc-api/src/state/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! State RPC errors. use crate::errors; diff --git a/client/rpc-api/src/state/helpers.rs b/client/rpc-api/src/state/helpers.rs index b740a8e33b..0d176ea67f 100644 --- a/client/rpc-api/src/state/helpers.rs +++ b/client/rpc-api/src/state/helpers.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate state API helpers. use sp_core::Bytes; diff --git a/client/rpc-api/src/state/mod.rs b/client/rpc-api/src/state/mod.rs index cec32a26c6..1bfbb4786e 100644 --- a/client/rpc-api/src/state/mod.rs +++ b/client/rpc-api/src/state/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate state API. pub mod error; diff --git a/client/rpc-api/src/subscriptions.rs b/client/rpc-api/src/subscriptions.rs index 772e9d4ee8..7feae662ee 100644 --- a/client/rpc-api/src/subscriptions.rs +++ b/client/rpc-api/src/subscriptions.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::collections::HashMap; use std::sync::{Arc, atomic::{self, AtomicUsize}}; diff --git a/client/rpc-api/src/system/error.rs b/client/rpc-api/src/system/error.rs index bd75b86493..4897aa485c 100644 --- a/client/rpc-api/src/system/error.rs +++ b/client/rpc-api/src/system/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! System RPC module errors. use crate::system::helpers::Health; diff --git a/client/rpc-api/src/system/helpers.rs b/client/rpc-api/src/system/helpers.rs index fbc68de05a..5dbe93543d 100644 --- a/client/rpc-api/src/system/helpers.rs +++ b/client/rpc-api/src/system/helpers.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate system API helpers. use std::fmt; diff --git a/client/rpc-api/src/system/mod.rs b/client/rpc-api/src/system/mod.rs index 6a2026c978..a7b746ee1b 100644 --- a/client/rpc-api/src/system/mod.rs +++ b/client/rpc-api/src/system/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate system API. pub mod error; diff --git a/client/rpc-servers/src/lib.rs b/client/rpc-servers/src/lib.rs index 3366343213..6fe4586b6e 100644 --- a/client/rpc-servers/src/lib.rs +++ b/client/rpc-servers/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate RPC servers. #![warn(missing_docs)] diff --git a/client/rpc/src/author/mod.rs b/client/rpc/src/author/mod.rs index fc23db95a8..d59fad354e 100644 --- a/client/rpc/src/author/mod.rs +++ b/client/rpc/src/author/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate block-author/full-node API. #[cfg(test)] diff --git a/client/rpc/src/author/tests.rs b/client/rpc/src/author/tests.rs index a9caa6d91a..8c1b82028b 100644 --- a/client/rpc/src/author/tests.rs +++ b/client/rpc/src/author/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::*; use std::{mem, sync::Arc}; diff --git a/client/rpc/src/chain/mod.rs b/client/rpc/src/chain/mod.rs index 8341724227..6d53fbbb06 100644 --- a/client/rpc/src/chain/mod.rs +++ b/client/rpc/src/chain/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate blockchain API. mod chain_full; diff --git a/client/rpc/src/chain/tests.rs b/client/rpc/src/chain/tests.rs index 477438e286..e86d1d547f 100644 --- a/client/rpc/src/chain/tests.rs +++ b/client/rpc/src/chain/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::*; use assert_matches::assert_matches; use substrate_test_runtime_client::{ diff --git a/client/rpc/src/lib.rs b/client/rpc/src/lib.rs index 0ec44b5663..f979b0ab69 100644 --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate RPC implementation. //! //! A core implementation of Substrate RPC interfaces. diff --git a/client/rpc/src/metadata.rs b/client/rpc/src/metadata.rs index 3c2902694e..0416b07a67 100644 --- a/client/rpc/src/metadata.rs +++ b/client/rpc/src/metadata.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! RPC Metadata use std::sync::Arc; diff --git a/client/rpc/src/offchain/mod.rs b/client/rpc/src/offchain/mod.rs index f55148b451..f8d2bb6a50 100644 --- a/client/rpc/src/offchain/mod.rs +++ b/client/rpc/src/offchain/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate offchain API. #[cfg(test)] diff --git a/client/rpc/src/offchain/tests.rs b/client/rpc/src/offchain/tests.rs index f1fa925a35..f65971a7ff 100644 --- a/client/rpc/src/offchain/tests.rs +++ b/client/rpc/src/offchain/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::*; use assert_matches::assert_matches; use sp_core::{Bytes, offchain::storage::InMemOffchainStorage}; diff --git a/client/rpc/src/state/mod.rs b/client/rpc/src/state/mod.rs index e4d6918afb..168dc3e010 100644 --- a/client/rpc/src/state/mod.rs +++ b/client/rpc/src/state/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate state API. mod state_full; diff --git a/client/rpc/src/state/tests.rs b/client/rpc/src/state/tests.rs index a275624053..a610cbbfc8 100644 --- a/client/rpc/src/state/tests.rs +++ b/client/rpc/src/state/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::*; use super::state_full::split_range; use self::error::Error; diff --git a/client/rpc/src/system/mod.rs b/client/rpc/src/system/mod.rs index 92a5f61c89..4b8abbe144 100644 --- a/client/rpc/src/system/mod.rs +++ b/client/rpc/src/system/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate system API. #[cfg(test)] diff --git a/client/rpc/src/system/tests.rs b/client/rpc/src/system/tests.rs index e79e85f771..25ebd80953 100644 --- a/client/rpc/src/system/tests.rs +++ b/client/rpc/src/system/tests.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use super::*; use sc_network::{self, PeerId}; diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 81a861d621..cc7929e88c 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::{Service, NetworkStatus, NetworkState, error::Error, DEFAULT_PROTOCOL_ID, MallocSizeOfWasm}; use crate::{start_rpc_servers, build_network_future, TransactionPoolAdapter, TaskManager, SpawnTaskHandle}; use crate::status_sinks; diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index f02161fc72..5c7dca0da7 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Chain utilities. use crate::error; diff --git a/client/service/src/client/block_rules.rs b/client/service/src/client/block_rules.rs index 0d7e8effc6..247d09197b 100644 --- a/client/service/src/client/block_rules.rs +++ b/client/service/src/client/block_rules.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Client fixed chain specification rules use std::collections::{HashMap, HashSet}; diff --git a/client/service/src/client/call_executor.rs b/client/service/src/client/call_executor.rs index d0304914ff..049bd888b1 100644 --- a/client/service/src/client/call_executor.rs +++ b/client/service/src/client/call_executor.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{sync::Arc, panic::UnwindSafe, result, cell::RefCell}; use codec::{Encode, Decode}; use sp_runtime::{ diff --git a/client/service/src/client/client.rs b/client/service/src/client/client.rs index 9db7b714e1..77b3f065f4 100644 --- a/client/service/src/client/client.rs +++ b/client/service/src/client/client.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate Client use std::{ diff --git a/client/service/src/client/genesis.rs b/client/service/src/client/genesis.rs index 9f68e20950..4df08025e3 100644 --- a/client/service/src/client/genesis.rs +++ b/client/service/src/client/genesis.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Tool for creating the genesis block. use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Hash as HashT, Zero}; diff --git a/client/service/src/client/light/blockchain.rs b/client/service/src/client/light/blockchain.rs index 6076b386dc..c7b20de594 100644 --- a/client/service/src/client/light/blockchain.rs +++ b/client/service/src/client/light/blockchain.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Light client blockchain backend. Only stores headers and justifications of recent //! blocks. CHT roots are stored for headers of ancient blocks. diff --git a/client/service/src/client/light/call_executor.rs b/client/service/src/client/light/call_executor.rs index 0f6a8f1372..81be65339b 100644 --- a/client/service/src/client/light/call_executor.rs +++ b/client/service/src/client/light/call_executor.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Methods that light client could use to execute runtime calls. use std::{ diff --git a/client/service/src/client/light/fetcher.rs b/client/service/src/client/light/fetcher.rs index b62225c59c..5422554967 100644 --- a/client/service/src/client/light/fetcher.rs +++ b/client/service/src/client/light/fetcher.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Light client data fetcher. Fetches requested data from remote full nodes. use std::sync::Arc; diff --git a/client/service/src/client/light/mod.rs b/client/service/src/client/light/mod.rs index 32288d7b8b..a3456f96a3 100644 --- a/client/service/src/client/light/mod.rs +++ b/client/service/src/client/light/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Light client components. pub mod backend; diff --git a/client/service/src/client/mod.rs b/client/service/src/client/mod.rs index 52a67eb3e3..7c96f61a78 100644 --- a/client/service/src/client/mod.rs +++ b/client/service/src/client/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate Client and associated logic. //! //! The [`Client`] is one of the most important components of Substrate. It mainly comprises two diff --git a/client/service/src/config.rs b/client/service/src/config.rs index 7e4949e534..cc9c742ed6 100644 --- a/client/service/src/config.rs +++ b/client/service/src/config.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Service configuration. pub use sc_client_db::{Database, PruningMode, DatabaseSettingsSrc as DatabaseConfig}; diff --git a/client/service/src/error.rs b/client/service/src/error.rs index 244fa553ff..ffe1b39405 100644 --- a/client/service/src/error.rs +++ b/client/service/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Errors that can occur during the service operation. use sc_network; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index 9e97bb5756..c902e6bb90 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate service. Starts a thread that spins up the network, client, and extrinsic pool. //! Manages communication between them. diff --git a/client/service/src/metrics.rs b/client/service/src/metrics.rs index 040dc8eb62..f3463ffdbe 100644 --- a/client/service/src/metrics.rs +++ b/client/service/src/metrics.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::convert::TryFrom; use crate::NetworkStatus; diff --git a/client/service/test/src/client/db.rs b/client/service/test/src/client/db.rs index 19cf62b30d..36d4973224 100644 --- a/client/service/test/src/client/db.rs +++ b/client/service/test/src/client/db.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use sp_core::offchain::{OffchainStorage, storage::InMemOffchainStorage}; use std::sync::Arc; @@ -53,4 +54,4 @@ fn in_memory_offchain_storage() { assert!(!storage.compare_and_set(b"B", b"A", Some(b""), b"Y")); assert!(storage.compare_and_set(b"B", b"A", None, b"X")); assert_eq!(storage.get(b"B", b"A"), Some(b"X".to_vec())); -} \ No newline at end of file +} diff --git a/client/service/test/src/client/mod.rs b/client/service/test/src/client/mod.rs index 1cfbe2930d..2124f0ced4 100644 --- a/client/service/test/src/client/mod.rs +++ b/client/service/test/src/client/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use parity_scale_codec::{Encode, Decode, Joiner}; use sc_executor::native_executor_instance; use sp_state_machine::{StateMachine, OverlayedChanges, ExecutionStrategy, InMemoryBackend}; diff --git a/client/service/test/src/lib.rs b/client/service/test/src/lib.rs index a7e4b31ebb..63c7e0795d 100644 --- a/client/service/test/src/lib.rs +++ b/client/service/test/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Service integration test utils. use std::iter; diff --git a/client/state-db/src/lib.rs b/client/state-db/src/lib.rs index 68c658beb6..61470894e4 100644 --- a/client/state-db/src/lib.rs +++ b/client/state-db/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! State database maintenance. Handles canonicalization and pruning in the database. The input to //! this module is a `ChangeSet` which is basically a list of key-value pairs (trie nodes) that //! were added or deleted during block execution. diff --git a/client/state-db/src/noncanonical.rs b/client/state-db/src/noncanonical.rs index 34e7a8725c..d77f20c50d 100644 --- a/client/state-db/src/noncanonical.rs +++ b/client/state-db/src/noncanonical.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Canonicalization window. //! Maintains trees of block overlays and allows discarding trees/roots //! The overlays are added in `insert` and removed in `canonicalize`. diff --git a/client/state-db/src/pruning.rs b/client/state-db/src/pruning.rs index 743db9bc1f..69b07c285f 100644 --- a/client/state-db/src/pruning.rs +++ b/client/state-db/src/pruning.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Pruning window. //! //! For each block we maintain a list of nodes pending deletion. diff --git a/client/state-db/src/test.rs b/client/state-db/src/test.rs index 17686031a7..11ce4ad822 100644 --- a/client/state-db/src/test.rs +++ b/client/state-db/src/test.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Test utils use std::collections::HashMap; diff --git a/client/telemetry/src/lib.rs b/client/telemetry/src/lib.rs index 0752a3c53f..315bedbe5b 100644 --- a/client/telemetry/src/lib.rs +++ b/client/telemetry/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Telemetry utilities. //! //! Calling `init_telemetry` registers a global `slog` logger using `slog_scope::set_global_logger`. diff --git a/client/telemetry/src/worker.rs b/client/telemetry/src/worker.rs index b147313aee..68d4c4e209 100644 --- a/client/telemetry/src/worker.rs +++ b/client/telemetry/src/worker.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Contains the object that makes the telemetry work. //! //! # Usage diff --git a/client/telemetry/src/worker/node.rs b/client/telemetry/src/worker/node.rs index bdca054c23..6b1a0f62b1 100644 --- a/client/telemetry/src/worker/node.rs +++ b/client/telemetry/src/worker/node.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Contains the `Node` struct, which handles communications with a single telemetry endpoint. use bytes::BytesMut; diff --git a/client/transaction-pool/graph/benches/basics.rs b/client/transaction-pool/graph/benches/basics.rs index 80d5ac838b..ee92b60d54 100644 --- a/client/transaction-pool/graph/benches/basics.rs +++ b/client/transaction-pool/graph/benches/basics.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use criterion::{criterion_group, criterion_main, Criterion}; use futures::{future::{ready, Ready}, executor::block_on}; diff --git a/client/transaction-pool/graph/src/base_pool.rs b/client/transaction-pool/graph/src/base_pool.rs index 2cb9a16126..0128e94675 100644 --- a/client/transaction-pool/graph/src/base_pool.rs +++ b/client/transaction-pool/graph/src/base_pool.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! A basic version of the dependency graph. //! //! For a more full-featured pool, have a look at the `pool` module. diff --git a/client/transaction-pool/graph/src/error.rs b/client/transaction-pool/graph/src/error.rs index b970ab6f45..392ddaa39b 100644 --- a/client/transaction-pool/graph/src/error.rs +++ b/client/transaction-pool/graph/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Transaction pool errors. use sp_runtime::transaction_validity::{ diff --git a/client/transaction-pool/graph/src/future.rs b/client/transaction-pool/graph/src/future.rs index 76fa51a3ad..80e6825d4f 100644 --- a/client/transaction-pool/graph/src/future.rs +++ b/client/transaction-pool/graph/src/future.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{ collections::{HashMap, HashSet}, fmt, diff --git a/client/transaction-pool/graph/src/lib.rs b/client/transaction-pool/graph/src/lib.rs index 6ef80e2eb2..04e5d0d3fb 100644 --- a/client/transaction-pool/graph/src/lib.rs +++ b/client/transaction-pool/graph/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Generic Transaction Pool //! //! The pool is based on dependency graph between transactions diff --git a/client/transaction-pool/graph/src/listener.rs b/client/transaction-pool/graph/src/listener.rs index 0bee4384c2..cccf542199 100644 --- a/client/transaction-pool/graph/src/listener.rs +++ b/client/transaction-pool/graph/src/listener.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{ collections::HashMap, hash, }; diff --git a/client/transaction-pool/graph/src/pool.rs b/client/transaction-pool/graph/src/pool.rs index ffcdcdc06f..4f41e91109 100644 --- a/client/transaction-pool/graph/src/pool.rs +++ b/client/transaction-pool/graph/src/pool.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{ hash, collections::HashMap, diff --git a/client/transaction-pool/graph/src/ready.rs b/client/transaction-pool/graph/src/ready.rs index dcd55f980f..b5807ffce4 100644 --- a/client/transaction-pool/graph/src/ready.rs +++ b/client/transaction-pool/graph/src/ready.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{ collections::{HashMap, HashSet, BTreeSet}, cmp, diff --git a/client/transaction-pool/graph/src/rotator.rs b/client/transaction-pool/graph/src/rotator.rs index a6bb855f23..65e21d0d4b 100644 --- a/client/transaction-pool/graph/src/rotator.rs +++ b/client/transaction-pool/graph/src/rotator.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Rotate extrinsic inside the pool. //! //! Keeps only recent extrinsic and discard the ones kept for a significant amount of time. diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 66047ad50d..7e8e91efe8 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use std::{ collections::{HashSet, HashMap}, hash, diff --git a/client/transaction-pool/graph/src/watcher.rs b/client/transaction-pool/graph/src/watcher.rs index 1c03c0e6a8..9d9a91bb23 100644 --- a/client/transaction-pool/graph/src/watcher.rs +++ b/client/transaction-pool/graph/src/watcher.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Extrinsics status updates. use futures::Stream; diff --git a/client/transaction-pool/src/api.rs b/client/transaction-pool/src/api.rs index f2cd9c707f..725fb6ec4a 100644 --- a/client/transaction-pool/src/api.rs +++ b/client/transaction-pool/src/api.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Chain api required for the transaction pool. use std::{marker::PhantomData, pin::Pin, sync::Arc}; diff --git a/client/transaction-pool/src/error.rs b/client/transaction-pool/src/error.rs index fa05ca6a64..c0f795df18 100644 --- a/client/transaction-pool/src/error.rs +++ b/client/transaction-pool/src/error.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Transaction pool error. use sp_transaction_pool::error::Error as TxPoolError; diff --git a/client/transaction-pool/src/lib.rs b/client/transaction-pool/src/lib.rs index 8976003b7d..05d7189a04 100644 --- a/client/transaction-pool/src/lib.rs +++ b/client/transaction-pool/src/lib.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Substrate transaction pool implementation. #![recursion_limit="256"] diff --git a/client/transaction-pool/src/metrics.rs b/client/transaction-pool/src/metrics.rs index 68c5042f2d..e377b2fe82 100644 --- a/client/transaction-pool/src/metrics.rs +++ b/client/transaction-pool/src/metrics.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Transaction pool Prometheus metrics. use std::sync::Arc; diff --git a/client/transaction-pool/src/revalidation.rs b/client/transaction-pool/src/revalidation.rs index 261ef5a140..33f3a3da47 100644 --- a/client/transaction-pool/src/revalidation.rs +++ b/client/transaction-pool/src/revalidation.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Pool periodic revalidation. use std::{sync::Arc, pin::Pin, collections::{HashMap, HashSet, BTreeMap}}; diff --git a/client/transaction-pool/src/testing/mod.rs b/client/transaction-pool/src/testing/mod.rs index c22d61491a..350c4137c3 100644 --- a/client/transaction-pool/src/testing/mod.rs +++ b/client/transaction-pool/src/testing/mod.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + //! Tests for top-level transaction pool api mod pool; diff --git a/client/transaction-pool/src/testing/pool.rs b/client/transaction-pool/src/testing/pool.rs index 0b5ce8e90d..4f30d5b6c3 100644 --- a/client/transaction-pool/src/testing/pool.rs +++ b/client/transaction-pool/src/testing/pool.rs @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . + use crate::*; use sp_transaction_pool::TransactionStatus; use futures::executor::block_on; -- GitLab From b3d38bfdb5842a7eba5bcc8eed9a7cd65aca0d11 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 20 May 2020 21:12:49 +0200 Subject: [PATCH 087/150] Turn a SmallVec into VecDeque for performances (#6091) * Turn a SmallVec into VecDeque for performances * Fix the other SmallVecs --- .../src/protocol/generic_proto/behaviour.rs | 64 ++++++++++--------- .../protocol/generic_proto/handler/legacy.rs | 17 +++-- .../generic_proto/handler/notif_in.rs | 14 ++-- .../generic_proto/handler/notif_out.rs | 22 +++---- 4 files changed, 58 insertions(+), 59 deletions(-) diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 32cf417ec4..9d48d40bdf 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -34,7 +34,7 @@ use prometheus_endpoint::HistogramVec; use rand::distributions::{Distribution as _, Uniform}; use smallvec::SmallVec; use std::task::{Context, Poll}; -use std::{borrow::Cow, cmp, collections::hash_map::Entry}; +use std::{borrow::Cow, cmp, collections::{hash_map::Entry, VecDeque}}; use std::{error, mem, pin::Pin, str, time::Duration}; use wasm_timer::Instant; @@ -135,7 +135,7 @@ pub struct GenericProto { next_incoming_index: sc_peerset::IncomingIndex, /// Events to produce from `poll()`. - events: SmallVec<[NetworkBehaviourAction; 4]>, + events: VecDeque>, /// If `Some`, report the message queue sizes on this `Histogram`. queue_size_report: Option, @@ -340,7 +340,7 @@ impl GenericProto { peers: FnvHashMap::default(), incoming: SmallVec::new(), next_incoming_index: sc_peerset::IncomingIndex(0), - events: SmallVec::new(), + events: VecDeque::new(), queue_size_report, } } @@ -374,7 +374,7 @@ impl GenericProto { // Send an event to all the peers we're connected to, updating the handshake message. for (peer_id, _) in self.peers.iter().filter(|(_, state)| state.is_connected()) { - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::UpdateHandshake { @@ -446,7 +446,7 @@ impl GenericProto { debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); self.peerset.dropped(peer_id.clone()); debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", peer_id); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Disable, @@ -471,7 +471,7 @@ impl GenericProto { inc.alive = false; debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", peer_id); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Disable, @@ -562,7 +562,7 @@ impl GenericProto { ); trace!(target: "sub-libp2p", "Handler({:?}) <= Packet", target); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: target.clone(), handler: NotifyHandler::One(conn), event: NotifsHandlerIn::SendNotification { @@ -592,7 +592,7 @@ impl GenericProto { trace!(target: "sub-libp2p", "External API => Packet for {:?}", target); trace!(target: "sub-libp2p", "Handler({:?}) <= Packet", target); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: target.clone(), handler: NotifyHandler::One(conn), event: NotifsHandlerIn::SendLegacy { @@ -614,7 +614,7 @@ impl GenericProto { // If there's no entry in `self.peers`, start dialing. debug!(target: "sub-libp2p", "PSM => Connect({:?}): Starting to connect", entry.key()); debug!(target: "sub-libp2p", "Libp2p <= Dial {:?}", entry.key()); - self.events.push(NetworkBehaviourAction::DialPeer { + self.events.push_back(NetworkBehaviourAction::DialPeer { peer_id: entry.key().clone(), condition: DialPeerCondition::Disconnected }); @@ -638,7 +638,7 @@ impl GenericProto { PeerState::Banned { .. } => { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Starting to connect", occ_entry.key()); debug!(target: "sub-libp2p", "Libp2p <= Dial {:?}", occ_entry.key()); - self.events.push(NetworkBehaviourAction::DialPeer { + self.events.push_back(NetworkBehaviourAction::DialPeer { peer_id: occ_entry.key().clone(), condition: DialPeerCondition::Disconnected }); @@ -662,7 +662,7 @@ impl GenericProto { debug!(target: "sub-libp2p", "PSM => Connect({:?}): Enabling connections.", occ_entry.key()); debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: occ_entry.key().clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Enable, @@ -681,7 +681,7 @@ impl GenericProto { incoming for incoming peer") } debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", occ_entry.key()); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: occ_entry.key().clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Enable, @@ -746,7 +746,7 @@ impl GenericProto { PeerState::Enabled { open } => { debug!(target: "sub-libp2p", "PSM => Drop({:?}): Disabling connections.", entry.key()); debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", entry.key()); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: entry.key().clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Disable, @@ -801,7 +801,7 @@ impl GenericProto { debug!(target: "sub-libp2p", "PSM => Accept({:?}, {:?}): Enabling connections.", index, incoming.peer_id); debug!(target: "sub-libp2p", "Handler({:?}) <= Enable", incoming.peer_id); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: incoming.peer_id, handler: NotifyHandler::All, event: NotifsHandlerIn::Enable, @@ -834,7 +834,7 @@ impl GenericProto { debug!(target: "sub-libp2p", "PSM => Reject({:?}, {:?}): Rejecting connections.", index, incoming.peer_id); debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", incoming.peer_id); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: incoming.peer_id, handler: NotifyHandler::All, event: NotifsHandlerIn::Disable, @@ -881,7 +881,7 @@ impl NetworkBehaviour for GenericProto { peer_id, endpoint ); *st = PeerState::Enabled { open: SmallVec::new() }; - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::One(*conn), event: NotifsHandlerIn::Enable @@ -925,7 +925,7 @@ impl NetworkBehaviour for GenericProto { "Libp2p => Connected({},{:?}): Not requested by PSM, disabling.", peer_id, endpoint); *st = PeerState::Disabled { open: SmallVec::new(), banned_until }; - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::One(*conn), event: NotifsHandlerIn::Disable @@ -941,7 +941,7 @@ impl NetworkBehaviour for GenericProto { (PeerState::Enabled { .. }, _) => { debug!(target: "sub-libp2p", "Handler({},{:?}) <= Enable secondary connection", peer_id, conn); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::One(*conn), event: NotifsHandlerIn::Enable @@ -951,7 +951,7 @@ impl NetworkBehaviour for GenericProto { (PeerState::Disabled { .. }, _) | (PeerState::DisabledPendingEnable { .. }, _) => { debug!(target: "sub-libp2p", "Handler({},{:?}) <= Disable secondary connection", peer_id, conn); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::One(*conn), event: NotifsHandlerIn::Disable @@ -979,7 +979,7 @@ impl NetworkBehaviour for GenericProto { reason: "Disconnected by libp2p".into(), }; - self.events.push(NetworkBehaviourAction::GenerateEvent(event)); + self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } } _ => {} @@ -1144,7 +1144,7 @@ impl NetworkBehaviour for GenericProto { debug!(target: "sub-libp2p", "Handler({:?}) <= Disable", source); debug!(target: "sub-libp2p", "PSM <= Dropped({:?})", source); self.peerset.dropped(source.clone()); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: source.clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Disable, @@ -1216,7 +1216,7 @@ impl NetworkBehaviour for GenericProto { reason, peer_id: source, }; - self.events.push(NetworkBehaviourAction::GenerateEvent(event)); + self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } else { debug!(target: "sub-libp2p", "Secondary connection closed custom protocol."); } @@ -1254,7 +1254,7 @@ impl NetworkBehaviour for GenericProto { if first { debug!(target: "sub-libp2p", "External API <= Open({:?})", source); let event = GenericProtoOut::CustomProtocolOpen { peer_id: source }; - self.events.push(NetworkBehaviourAction::GenerateEvent(event)); + self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } else { debug!(target: "sub-libp2p", "Secondary connection opened custom protocol."); } @@ -1269,7 +1269,7 @@ impl NetworkBehaviour for GenericProto { message, }; - self.events.push(NetworkBehaviourAction::GenerateEvent(event)); + self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } NotifsHandlerOut::Notification { protocol_name, message } => { @@ -1287,7 +1287,7 @@ impl NetworkBehaviour for GenericProto { message, }; - self.events.push(NetworkBehaviourAction::GenerateEvent(event)); + self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } NotifsHandlerOut::Clogged { messages } => { @@ -1296,7 +1296,7 @@ impl NetworkBehaviour for GenericProto { trace!(target: "sub-libp2p", "External API <= Clogged({:?})", source); warn!(target: "sub-libp2p", "Queue of packets to send to {:?} is \ pretty large", source); - self.events.push(NetworkBehaviourAction::GenerateEvent(GenericProtoOut::Clogged { + self.events.push_back(NetworkBehaviourAction::GenerateEvent(GenericProtoOut::Clogged { peer_id: source, messages, })); @@ -1335,6 +1335,10 @@ impl NetworkBehaviour for GenericProto { Self::OutEvent, >, > { + if let Some(event) = self.events.pop_front() { + return Poll::Ready(event); + } + // Poll for instructions from the peerset. // Note that the peerset is a *best effort* crate, and we have to use defensive programming. loop { @@ -1368,7 +1372,7 @@ impl NetworkBehaviour for GenericProto { } debug!(target: "sub-libp2p", "Libp2p <= Dial {:?} now that ban has expired", peer_id); - self.events.push(NetworkBehaviourAction::DialPeer { + self.events.push_back(NetworkBehaviourAction::DialPeer { peer_id: peer_id.clone(), condition: DialPeerCondition::Disconnected }); @@ -1390,7 +1394,7 @@ impl NetworkBehaviour for GenericProto { } debug!(target: "sub-libp2p", "Handler({:?}) <= Enable (ban expired)", peer_id); - self.events.push(NetworkBehaviourAction::NotifyHandler { + self.events.push_back(NetworkBehaviourAction::NotifyHandler { peer_id: peer_id.clone(), handler: NotifyHandler::All, event: NotifsHandlerIn::Enable, @@ -1402,8 +1406,8 @@ impl NetworkBehaviour for GenericProto { } } - if !self.events.is_empty() { - return Poll::Ready(self.events.remove(0)) + if let Some(event) = self.events.pop_front() { + return Poll::Ready(event); } Poll::Pending diff --git a/client/network/src/protocol/generic_proto/handler/legacy.rs b/client/network/src/protocol/generic_proto/handler/legacy.rs index e51b37139b..c7de2d265e 100644 --- a/client/network/src/protocol/generic_proto/handler/legacy.rs +++ b/client/network/src/protocol/generic_proto/handler/legacy.rs @@ -30,7 +30,7 @@ use libp2p::swarm::{ }; use log::{debug, error}; use smallvec::{smallvec, SmallVec}; -use std::{borrow::Cow, error, fmt, io, mem, time::Duration}; +use std::{borrow::Cow, collections::VecDeque, error, fmt, io, mem, time::Duration}; use std::{pin::Pin, task::{Context, Poll}}; /// Implements the `IntoProtocolsHandler` trait of libp2p. @@ -117,7 +117,7 @@ impl IntoProtocolsHandler for LegacyProtoHandlerProto { substreams: SmallVec::new(), init_deadline: Delay::new(Duration::from_secs(20)) }, - events_queue: SmallVec::new(), + events_queue: VecDeque::new(), } } } @@ -142,7 +142,7 @@ pub struct LegacyProtoHandler { /// /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. - events_queue: SmallVec<[ProtocolsHandlerEvent; 16]>, + events_queue: VecDeque>, } /// State of the handler. @@ -277,7 +277,7 @@ impl LegacyProtoHandler { ProtocolState::Init { substreams: incoming, .. } => { if incoming.is_empty() { if let ConnectedPoint::Dialer { .. } = self.endpoint { - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { + self.events_queue.push_back(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(self.protocol.clone()), info: (), }); @@ -290,7 +290,7 @@ impl LegacyProtoHandler { version: incoming[0].protocol_version(), endpoint: self.endpoint.clone() }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(event)); ProtocolState::Normal { substreams: incoming.into_iter().collect(), shutdown: SmallVec::new() @@ -488,7 +488,7 @@ impl LegacyProtoHandler { version: substream.protocol_version(), endpoint: self.endpoint.clone() }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(event)); + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(event)); ProtocolState::Normal { substreams: smallvec![substream], shutdown: SmallVec::new() @@ -565,7 +565,7 @@ impl ProtocolsHandler for LegacyProtoHandler { _ => false, }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::ProtocolError { + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(LegacyProtoHandlerOut::ProtocolError { is_severe, error: Box::new(err), })); @@ -587,8 +587,7 @@ impl ProtocolsHandler for LegacyProtoHandler { ProtocolsHandlerEvent > { // Flush the events queue if necessary. - if !self.events_queue.is_empty() { - let event = self.events_queue.remove(0); + if let Some(event) = self.events_queue.pop_front() { return Poll::Ready(event) } diff --git a/client/network/src/protocol/generic_proto/handler/notif_in.rs b/client/network/src/protocol/generic_proto/handler/notif_in.rs index ef4644c548..be78fb970e 100644 --- a/client/network/src/protocol/generic_proto/handler/notif_in.rs +++ b/client/network/src/protocol/generic_proto/handler/notif_in.rs @@ -37,8 +37,7 @@ use libp2p::swarm::{ NegotiatedSubstream, }; use log::{error, warn}; -use smallvec::SmallVec; -use std::{borrow::Cow, fmt, pin::Pin, task::{Context, Poll}}; +use std::{borrow::Cow, collections::VecDeque, fmt, pin::Pin, task::{Context, Poll}}; /// Implements the `IntoProtocolsHandler` trait of libp2p. /// @@ -70,7 +69,7 @@ pub struct NotifsInHandler { /// /// This queue is only ever modified to insert elements at the back, or remove the first /// element. - events_queue: SmallVec<[ProtocolsHandlerEvent; 16]>, + events_queue: VecDeque>, } /// Event that can be received by a `NotifsInHandler`. @@ -130,7 +129,7 @@ impl IntoProtocolsHandler for NotifsInHandlerProto { in_protocol: self.in_protocol, substream: None, pending_accept_refuses: 0, - events_queue: SmallVec::new(), + events_queue: VecDeque::new(), } } } @@ -160,7 +159,7 @@ impl ProtocolsHandler for NotifsInHandler { ) { // If a substream already exists, we drop it and replace it with the new incoming one. if self.substream.is_some() { - self.events_queue.push(ProtocolsHandlerEvent::Custom(NotifsInHandlerOut::Closed)); + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(NotifsInHandlerOut::Closed)); } // Note that we drop the existing substream, which will send an equivalent to a TCP "RST" @@ -171,7 +170,7 @@ impl ProtocolsHandler for NotifsInHandler { // and we can't close "more" than that anyway. self.substream = Some(proto); - self.events_queue.push(ProtocolsHandlerEvent::Custom(NotifsInHandlerOut::OpenRequest(msg))); + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(NotifsInHandlerOut::OpenRequest(msg))); self.pending_accept_refuses = self.pending_accept_refuses .checked_add(1) .unwrap_or_else(|| { @@ -233,8 +232,7 @@ impl ProtocolsHandler for NotifsInHandler { ProtocolsHandlerEvent > { // Flush the events queue if necessary. - if !self.events_queue.is_empty() { - let event = self.events_queue.remove(0); + if let Some(event) = self.events_queue.pop_front() { return Poll::Ready(event) } diff --git a/client/network/src/protocol/generic_proto/handler/notif_out.rs b/client/network/src/protocol/generic_proto/handler/notif_out.rs index b5d6cd61ad..6b97ad67e3 100644 --- a/client/network/src/protocol/generic_proto/handler/notif_out.rs +++ b/client/network/src/protocol/generic_proto/handler/notif_out.rs @@ -35,8 +35,7 @@ use libp2p::swarm::{ }; use log::{debug, warn, error}; use prometheus_endpoint::Histogram; -use smallvec::SmallVec; -use std::{borrow::Cow, fmt, mem, pin::Pin, task::{Context, Poll}, time::Duration}; +use std::{borrow::Cow, collections::VecDeque, fmt, mem, pin::Pin, task::{Context, Poll}, time::Duration}; use wasm_timer::Instant; /// Maximum duration to open a substream and receive the handshake message. After that, we @@ -85,7 +84,7 @@ impl IntoProtocolsHandler for NotifsOutHandlerProto { when_connection_open: Instant::now(), queue_size_report: self.queue_size_report, state: State::Disabled, - events_queue: SmallVec::new(), + events_queue: VecDeque::new(), peer_id: peer_id.clone(), } } @@ -116,7 +115,7 @@ pub struct NotifsOutHandler { /// /// This queue must only ever be modified to insert elements at the back, or remove the first /// element. - events_queue: SmallVec<[ProtocolsHandlerEvent; 16]>, + events_queue: VecDeque>, /// Who we are connected to. peer_id: PeerId, @@ -247,7 +246,7 @@ impl ProtocolsHandler for NotifsOutHandler { match mem::replace(&mut self.state, State::Poisoned) { State::Opening { initial_message } => { let ev = NotifsOutHandlerOut::Open { handshake: handshake_msg }; - self.events_queue.push(ProtocolsHandlerEvent::Custom(ev)); + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(ev)); self.state = State::Open { substream, initial_message }; }, // If the handler was disabled while we were negotiating the protocol, immediately @@ -267,7 +266,7 @@ impl ProtocolsHandler for NotifsOutHandler { match mem::replace(&mut self.state, State::Poisoned) { State::Disabled => { let proto = NotificationsOut::new(self.protocol_name.clone(), initial_message.clone()); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { + self.events_queue.push_back(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(proto).with_timeout(OPEN_TIMEOUT), info: (), }); @@ -287,7 +286,7 @@ impl ProtocolsHandler for NotifsOutHandler { } let proto = NotificationsOut::new(self.protocol_name.clone(), initial_message.clone()); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { + self.events_queue.push_back(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(proto).with_timeout(OPEN_TIMEOUT), info: (), }); @@ -347,7 +346,7 @@ impl ProtocolsHandler for NotifsOutHandler { State::Opening { .. } => { self.state = State::Refused; let ev = NotifsOutHandlerOut::Refused; - self.events_queue.push(ProtocolsHandlerEvent::Custom(ev)); + self.events_queue.push_back(ProtocolsHandlerEvent::Custom(ev)); }, State::DisabledOpening => self.state = State::Disabled, State::Poisoned => error!("☎️ Notifications handler in a poisoned state"), @@ -371,9 +370,8 @@ impl ProtocolsHandler for NotifsOutHandler { cx: &mut Context, ) -> Poll> { // Flush the events queue if necessary. - if !self.events_queue.is_empty() { - let event = self.events_queue.remove(0); - return Poll::Ready(event); + if let Some(event) = self.events_queue.pop_front() { + return Poll::Ready(event) } match &mut self.state { @@ -385,7 +383,7 @@ impl ProtocolsHandler for NotifsOutHandler { let initial_message = mem::replace(initial_message, Vec::new()); self.state = State::Opening { initial_message: initial_message.clone() }; let proto = NotificationsOut::new(self.protocol_name.clone(), initial_message); - self.events_queue.push(ProtocolsHandlerEvent::OutboundSubstreamRequest { + self.events_queue.push_back(ProtocolsHandlerEvent::OutboundSubstreamRequest { protocol: SubstreamProtocol::new(proto).with_timeout(OPEN_TIMEOUT), info: (), }); -- GitLab From 9650348f6b24e4d1337710b2b019b01490c186ff Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 20 May 2020 21:33:16 +0200 Subject: [PATCH 088/150] evm: allow setting pre-defined accounts in genesis (#6086) * evm: allow setting pre-defined accounts in genesis * Only build GenesisAccount in std --- bin/node/runtime/src/lib.rs | 2 +- frame/evm/src/lib.rs | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 834aabbef8..eb8344d3e9 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -93,7 +93,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 249, + spec_version: 250, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index a2354c7761..eab3c80a93 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -25,6 +25,10 @@ mod backend; pub use crate::backend::{Account, Log, Vicinity, Backend}; use sp_std::{vec::Vec, marker::PhantomData}; +#[cfg(feature = "std")] +use codec::{Encode, Decode}; +#[cfg(feature = "std")] +use serde::{Serialize, Deserialize}; use frame_support::{ensure, decl_module, decl_storage, decl_event, decl_error}; use frame_support::weights::{Weight, DispatchClass, FunctionOf, Pays}; use frame_support::traits::{Currency, WithdrawReason, ExistenceRequirement, Get}; @@ -137,12 +141,43 @@ pub trait Trait: frame_system::Trait + pallet_timestamp::Trait { } } +#[cfg(feature = "std")] +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, Serialize, Deserialize)] +/// Account definition used for genesis block construction. +pub struct GenesisAccount { + /// Account nonce. + pub nonce: U256, + /// Account balance. + pub balance: U256, + /// Full account storage. + pub storage: std::collections::BTreeMap, + /// Account code. + pub code: Vec, +} + decl_storage! { trait Store for Module as EVM { - Accounts get(fn accounts) config(): map hasher(blake2_128_concat) H160 => Account; + Accounts get(fn accounts): map hasher(blake2_128_concat) H160 => Account; AccountCodes: map hasher(blake2_128_concat) H160 => Vec; AccountStorages: double_map hasher(blake2_128_concat) H160, hasher(blake2_128_concat) H256 => H256; } + + add_extra_genesis { + config(accounts): std::collections::BTreeMap; + build(|config: &GenesisConfig| { + for (address, account) in &config.accounts { + Accounts::insert(address, Account { + balance: account.balance, + nonce: account.nonce, + }); + AccountCodes::insert(address, &account.code); + + for (index, value) in &account.storage { + AccountStorages::insert(address, index, value); + } + } + }); + } } decl_event! { -- GitLab From 7fccdfac8232b2286c3dfd481ffcb2744ebc070b Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 20 May 2020 22:08:20 +0200 Subject: [PATCH 089/150] Make planning epoch config change in BABE easier (#5776) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make planning epoch config change in BABE easier * Bump node runtime version * Update frame/babe/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * BabeEpochConfiguration -> NextConfigDescriptor * Add tests for babe config changes Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: André Silva --- frame/babe/src/lib.rs | 21 ++++++++++++++++++--- frame/babe/src/tests.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index 6d32c22249..153ff0e992 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -42,7 +42,7 @@ use sp_inherents::{InherentIdentifier, InherentData, ProvideInherent, MakeFatalE use sp_consensus_babe::{ BABE_ENGINE_ID, ConsensusLog, BabeAuthorityWeight, SlotNumber, inherents::{INHERENT_IDENTIFIER, BabeInherentData}, - digests::{NextEpochDescriptor, PreDigest}, + digests::{NextEpochDescriptor, NextConfigDescriptor, PreDigest}, }; use sp_consensus_vrf::schnorrkel; pub use sp_consensus_babe::{AuthorityId, VRF_OUTPUT_LENGTH, RANDOMNESS_LENGTH, PUBLIC_KEY_LENGTH}; @@ -136,6 +136,9 @@ decl_storage! { // variable to its underlying value. pub Randomness get(fn randomness): schnorrkel::Randomness; + /// Next epoch configuration, if changed. + NextEpochConfig: Option; + /// Next epoch randomness. NextRandomness: schnorrkel::Randomness; @@ -364,6 +367,15 @@ impl Module { }) } + /// Plan an epoch config change. The epoch config change is recorded and will be enacted on the + /// next call to `enact_epoch_change`. The config will be activated one epoch after. Multiple calls to this + /// method will replace any existing planned config change that had not been enacted yet. + pub fn plan_config_change( + config: NextConfigDescriptor, + ) { + NextEpochConfig::put(config); + } + /// DANGEROUS: Enact an epoch change. Should be done on every block where `should_epoch_change` has returned `true`, /// and the caller is the only caller of this function. /// @@ -399,12 +411,15 @@ impl Module { // so that nodes can track changes. let next_randomness = NextRandomness::get(); - let next = NextEpochDescriptor { + let next_epoch = NextEpochDescriptor { authorities: next_authorities, randomness: next_randomness, }; + Self::deposit_consensus(ConsensusLog::NextEpochData(next_epoch)); - Self::deposit_consensus(ConsensusLog::NextEpochData(next)) + if let Some(next_config) = NextEpochConfig::take() { + Self::deposit_consensus(ConsensusLog::NextConfigData(next_config)); + } } // finds the start slot of the current epoch. only guaranteed to diff --git a/frame/babe/src/tests.rs b/frame/babe/src/tests.rs index be2d3ed036..ecb3639fc5 100644 --- a/frame/babe/src/tests.rs +++ b/frame/babe/src/tests.rs @@ -22,6 +22,7 @@ use mock::*; use frame_support::traits::OnFinalize; use pallet_session::ShouldEndSession; use sp_core::crypto::IsWrappedBy; +use sp_consensus_babe::AllowedSlots; use sp_consensus_vrf::schnorrkel::{VRFOutput, VRFProof}; const EMPTY_RANDOMNESS: [u8; 32] = [ @@ -150,3 +151,35 @@ fn can_predict_next_epoch_change() { assert_eq!(Babe::next_expected_epoch_change(System::block_number()), Some(5 + 2)); }) } + +#[test] +fn can_enact_next_config() { + new_test_ext(0).1.execute_with(|| { + assert_eq!(::EpochDuration::get(), 3); + // this sets the genesis slot to 6; + go_to_block(1, 6); + assert_eq!(Babe::genesis_slot(), 6); + assert_eq!(Babe::current_slot(), 6); + assert_eq!(Babe::epoch_index(), 0); + go_to_block(2, 7); + + Babe::plan_config_change(NextConfigDescriptor::V1 { + c: (1, 4), + allowed_slots: AllowedSlots::PrimarySlots, + }); + + progress_to_block(4); + Babe::on_finalize(9); + let header = System::finalize(); + + let consensus_log = sp_consensus_babe::ConsensusLog::NextConfigData( + sp_consensus_babe::digests::NextConfigDescriptor::V1 { + c: (1, 4), + allowed_slots: AllowedSlots::PrimarySlots, + } + ); + let consensus_digest = DigestItem::Consensus(BABE_ENGINE_ID, consensus_log.encode()); + + assert_eq!(header.digest.logs[2], consensus_digest.clone()) + }); +} -- GitLab From a97a49347d955716b40ed1185352ba236f9809d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= Date: Thu, 21 May 2020 12:16:04 +0200 Subject: [PATCH 090/150] Allow fee calculation to happen off-chain (#6076) * Emit a PaymentParameters event once per block This contains per-block paramaters need to calculate fees off-chain. * Add WeightToFee trait * Add documentation to polynomial types * Ignore pseudo code snippet for doc tests * Use `Mul` implementation of Perbill * Add tests for WeightToFeePolynomial * Revert "Emit a PaymentParameters event once per block" This reverts commit 6c4763baff3d8179676a3c1660fe7063fd56a8ca. Co-authored-by: Gavin Wood --- Cargo.lock | 46 ++++---- bin/node-template/runtime/src/lib.rs | 7 +- bin/node/executor/tests/basic.rs | 11 +- bin/node/executor/tests/fees.rs | 11 +- bin/node/runtime/src/impls.rs | 21 ++-- bin/node/runtime/src/lib.rs | 11 +- frame/balances/src/tests_composite.rs | 6 +- frame/balances/src/tests_local.rs | 6 +- frame/contracts/src/tests.rs | 4 +- frame/executive/src/lib.rs | 12 ++- frame/support/Cargo.toml | 1 + frame/support/src/weights.rs | 147 ++++++++++++++++++++++++++ frame/transaction-payment/Cargo.toml | 1 + frame/transaction-payment/src/lib.rs | 36 +++++-- 14 files changed, 241 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42a3c10cbf..8bd5963b81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -749,7 +749,7 @@ dependencies = [ "log", "regalloc", "serde", - "smallvec 1.3.0", + "smallvec 1.4.0", "target-lexicon", "thiserror", ] @@ -787,7 +787,7 @@ checksum = "e45f82e3446dd1ebb8c2c2f6a6b0e6cd6cd52965c7e5f7b1b35e9a9ace31ccde" dependencies = [ "cranelift-codegen", "log", - "smallvec 1.3.0", + "smallvec 1.4.0", "target-lexicon", ] @@ -1488,6 +1488,7 @@ dependencies = [ "paste", "pretty_assertions", "serde", + "smallvec 1.4.0", "sp-arithmetic", "sp-core", "sp-inherents", @@ -1875,7 +1876,7 @@ dependencies = [ "byteorder 1.3.4", "fallible-iterator", "indexmap", - "smallvec 1.3.0", + "smallvec 1.4.0", "stable_deref_trait", ] @@ -2495,7 +2496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e763b2a9b500ba47948061d1e8bc3b5f03a8a1f067dbcf822a4d2c84d2b54a3a" dependencies = [ "parity-util-mem", - "smallvec 1.3.0", + "smallvec 1.4.0", ] [[package]] @@ -2524,7 +2525,7 @@ dependencies = [ "parking_lot 0.10.2", "regex", "rocksdb", - "smallvec 1.3.0", + "smallvec 1.4.0", ] [[package]] @@ -2630,7 +2631,7 @@ dependencies = [ "parity-multiaddr 0.9.0", "parking_lot 0.10.2", "pin-project", - "smallvec 1.3.0", + "smallvec 1.4.0", "wasm-timer", ] @@ -2661,7 +2662,7 @@ dependencies = [ "ring", "rw-stream-sink", "sha2", - "smallvec 1.3.0", + "smallvec 1.4.0", "thiserror", "unsigned-varint", "void", @@ -2714,7 +2715,7 @@ dependencies = [ "prost", "prost-build", "rand 0.7.3", - "smallvec 1.3.0", + "smallvec 1.4.0", ] [[package]] @@ -2737,7 +2738,7 @@ dependencies = [ "prost-build", "rand 0.7.3", "sha2", - "smallvec 1.3.0", + "smallvec 1.4.0", "unsigned-varint", "wasm-timer", ] @@ -2754,7 +2755,7 @@ dependencies = [ "log", "prost", "prost-build", - "smallvec 1.3.0", + "smallvec 1.4.0", "wasm-timer", ] @@ -2778,7 +2779,7 @@ dependencies = [ "prost-build", "rand 0.7.3", "sha2", - "smallvec 1.3.0", + "smallvec 1.4.0", "uint", "unsigned-varint", "void", @@ -2802,7 +2803,7 @@ dependencies = [ "log", "net2", "rand 0.7.3", - "smallvec 1.3.0", + "smallvec 1.4.0", "void", "wasm-timer", ] @@ -2931,7 +2932,7 @@ dependencies = [ "libp2p-core", "log", "rand 0.7.3", - "smallvec 1.3.0", + "smallvec 1.4.0", "void", "wasm-timer", ] @@ -3299,7 +3300,7 @@ dependencies = [ "futures 0.3.4", "log", "pin-project", - "smallvec 1.3.0", + "smallvec 1.4.0", "unsigned-varint", ] @@ -4652,6 +4653,7 @@ dependencies = [ "pallet-balances", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", + "smallvec 1.4.0", "sp-core", "sp-io", "sp-runtime", @@ -4847,7 +4849,7 @@ dependencies = [ "parity-util-mem-derive", "parking_lot 0.10.2", "primitive-types", - "smallvec 1.3.0", + "smallvec 1.4.0", "winapi 0.3.8", ] @@ -4923,7 +4925,7 @@ dependencies = [ "cloudabi", "libc", "redox_syscall", - "smallvec 1.3.0", + "smallvec 1.4.0", "winapi 0.3.8", ] @@ -5614,7 +5616,7 @@ checksum = "b27b256b41986ac5141b37b8bbba85d314fbf546c182eb255af6720e07e4f804" dependencies = [ "log", "rustc-hash", - "smallvec 1.3.0", + "smallvec 1.4.0", ] [[package]] @@ -7198,9 +7200,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05720e22615919e4734f6a99ceae50d00226c3c5aca406e102ebc33298214e0a" +checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" [[package]] name = "snow" @@ -7247,7 +7249,7 @@ dependencies = [ "log", "rand 0.7.3", "sha1", - "smallvec 1.3.0", + "smallvec 1.4.0", "static_assertions", "thiserror", ] @@ -8973,7 +8975,7 @@ dependencies = [ "hashbrown", "log", "rustc-hex", - "smallvec 1.3.0", + "smallvec 1.4.0", ] [[package]] @@ -9077,7 +9079,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" dependencies = [ - "smallvec 1.3.0", + "smallvec 1.4.0", ] [[package]] diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 2037f7bb77..55fa4cd4aa 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -15,8 +15,7 @@ use sp_runtime::{ transaction_validity::{TransactionValidity, TransactionSource}, }; use sp_runtime::traits::{ - BlakeTwo256, Block as BlockT, IdentityLookup, Verify, ConvertInto, IdentifyAccount, NumberFor, - Saturating, + BlakeTwo256, Block as BlockT, IdentityLookup, Verify, IdentifyAccount, NumberFor, Saturating, }; use sp_api::impl_runtime_apis; use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -36,7 +35,7 @@ pub use frame_support::{ construct_runtime, parameter_types, StorageValue, traits::{KeyOwnerProofSystem, Randomness}, weights::{ - Weight, + Weight, IdentityFee, constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, }, }; @@ -244,7 +243,7 @@ impl transaction_payment::Trait for Runtime { type Currency = balances::Module; type OnTransactionPayment = (); type TransactionByteFee = TransactionByteFee; - type WeightToFee = ConvertInto; + type WeightToFee = IdentityFee; type FeeMultiplierUpdate = (); } diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index 9350c3546f..857f438e1c 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -19,12 +19,15 @@ use codec::{Encode, Decode, Joiner}; use frame_support::{ StorageValue, StorageMap, traits::Currency, - weights::{GetDispatchInfo, DispatchInfo, DispatchClass, constants::ExtrinsicBaseWeight}, + weights::{ + GetDispatchInfo, DispatchInfo, DispatchClass, constants::ExtrinsicBaseWeight, + WeightToFeePolynomial, + }, }; use sp_core::{NeverNativeValue, traits::Externalities, storage::well_known_keys}; use sp_runtime::{ ApplyExtrinsicResult, Fixed128, - traits::{Hash as HashT, Convert}, + traits::Hash as HashT, transaction_validity::InvalidTransaction, }; use pallet_contracts::ContractAddressFor; @@ -54,9 +57,9 @@ fn transfer_fee(extrinsic: &E, fee_multiplier: Fixed128) -> Balance { let length_fee = TransactionByteFee::get() * (extrinsic.encode().len() as Balance); let base_weight = ExtrinsicBaseWeight::get(); - let base_fee = ::WeightToFee::convert(base_weight); + let base_fee = ::WeightToFee::calc(&base_weight); let weight = default_transfer_call().get_dispatch_info().weight; - let weight_fee = ::WeightToFee::convert(weight); + let weight_fee = ::WeightToFee::calc(&weight); base_fee + fee_multiplier.saturated_multiply_accumulate(length_fee + weight_fee) } diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs index 0e55f781e7..c4c3ca0bfc 100644 --- a/bin/node/executor/tests/fees.rs +++ b/bin/node/executor/tests/fees.rs @@ -19,16 +19,15 @@ use codec::{Encode, Joiner}; use frame_support::{ StorageValue, StorageMap, traits::Currency, - weights::{GetDispatchInfo, constants::ExtrinsicBaseWeight}, + weights::{GetDispatchInfo, constants::ExtrinsicBaseWeight, IdentityFee, WeightToFeePolynomial}, }; use sp_core::NeverNativeValue; -use sp_runtime::{Fixed128, Perbill, traits::Convert}; +use sp_runtime::{Fixed128, Perbill}; use node_runtime::{ CheckedExtrinsic, Call, Runtime, Balances, TransactionPayment, - TransactionByteFee, WeightFeeCoefficient, + TransactionByteFee, constants::currency::*, }; -use node_runtime::impls::LinearWeightToFee; use node_primitives::Balance; use node_testing::keyring::*; @@ -181,13 +180,13 @@ fn transaction_fee_is_correct_ultimate() { let mut balance_alice = (100 - 69) * DOLLARS; let base_weight = ExtrinsicBaseWeight::get(); - let base_fee = LinearWeightToFee::::convert(base_weight); + let base_fee = IdentityFee::::calc(&base_weight); let length_fee = TransactionByteFee::get() * (xt.clone().encode().len() as Balance); balance_alice -= length_fee; let weight = default_transfer_call().get_dispatch_info().weight; - let weight_fee = LinearWeightToFee::::convert(weight); + let weight_fee = IdentityFee::::calc(&weight); // we know that weight to fee multiplier is effect-less in block 1. // current weight of transfer = 200_000_000 diff --git a/bin/node/runtime/src/impls.rs b/bin/node/runtime/src/impls.rs index ef994392b5..884bde08df 100644 --- a/bin/node/runtime/src/impls.rs +++ b/bin/node/runtime/src/impls.rs @@ -21,7 +21,9 @@ use core::num::NonZeroI128; use node_primitives::Balance; use sp_runtime::traits::{Convert, Saturating}; use sp_runtime::{Fixed128, Perquintill}; -use frame_support::{traits::{OnUnbalanced, Currency, Get}, weights::Weight}; +use frame_support::{ + traits::{OnUnbalanced, Currency, Get}, +}; use crate::{Balances, System, Authorship, MaximumBlockWeight, NegativeImbalance}; pub struct Author; @@ -47,18 +49,6 @@ impl Convert for CurrencyToVoteHandler { fn convert(x: u128) -> Balance { x * Self::factor() } } -/// Convert from weight to balance via a simple coefficient multiplication -/// The associated type C encapsulates a constant in units of balance per weight -pub struct LinearWeightToFee(sp_std::marker::PhantomData); - -impl> Convert for LinearWeightToFee { - fn convert(w: Weight) -> Balance { - // setting this to zero will disable the weight fee. - let coefficient = C::get(); - Balance::from(w).saturating_mul(coefficient) - } -} - /// Update the given multiplier based on the following formula /// /// diff = (previous_block_weight - target_weight)/max_weight @@ -120,7 +110,7 @@ mod tests { use sp_runtime::assert_eq_error_rate; use crate::{MaximumBlockWeight, AvailableBlockRatio, Runtime}; use crate::{constants::currency::*, TransactionPayment, TargetBlockFullness}; - use frame_support::weights::Weight; + use frame_support::weights::{Weight, WeightToFeePolynomial}; use core::num::NonZeroI128; fn max() -> Weight { @@ -228,7 +218,8 @@ mod tests { if fm == next { panic!("The fee should ever increase"); } fm = next; iterations += 1; - let fee = ::WeightToFee::convert(tx_weight); + let fee = + ::WeightToFee::calc(&tx_weight); let adjusted_fee = fm.saturated_multiply_accumulate(fee); println!( "iteration {}, new fm = {:?}. Fee at this point is: {} units / {} millicents, \ diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index eb8344d3e9..209e86e747 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -26,7 +26,7 @@ use sp_std::prelude::*; use frame_support::{ construct_runtime, parameter_types, debug, weights::{ - Weight, + Weight, IdentityFee, constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND}, }, traits::{Currency, Imbalance, KeyOwnerProofSystem, OnUnbalanced, Randomness, LockIdentifier}, @@ -74,7 +74,7 @@ pub use pallet_staking::StakerStatus; /// Implementations of some helper traits passed into runtime modules as associated types. pub mod impls; -use impls::{CurrencyToVoteHandler, Author, LinearWeightToFee, TargetedFeeAdjustment}; +use impls::{CurrencyToVoteHandler, Author, TargetedFeeAdjustment}; /// Constant values used within the runtime. pub mod constants; @@ -228,9 +228,6 @@ impl pallet_balances::Trait for Runtime { parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; - // In the Substrate node, a weight of 10_000_000 (smallest non-zero weight) - // is mapped to 10_000_000 units of fees, hence: - pub const WeightFeeCoefficient: Balance = 1; // for a sane configuration, this should always be less than `AvailableBlockRatio`. pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); } @@ -239,7 +236,9 @@ impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = DealWithFees; type TransactionByteFee = TransactionByteFee; - type WeightToFee = LinearWeightToFee; + // In the Substrate node, a weight of 10_000_000 (smallest non-zero weight) + // is mapped to 10_000_000 units of fees, hence: + type WeightToFee = IdentityFee; type FeeMultiplierUpdate = TargetedFeeAdjustment; } diff --git a/frame/balances/src/tests_composite.rs b/frame/balances/src/tests_composite.rs index 78cdc3838b..7b9ec1f91e 100644 --- a/frame/balances/src/tests_composite.rs +++ b/frame/balances/src/tests_composite.rs @@ -21,14 +21,14 @@ use sp_runtime::{ Perbill, - traits::{ConvertInto, IdentityLookup}, + traits::IdentityLookup, testing::Header, }; use sp_core::H256; use sp_io; use frame_support::{impl_outer_origin, parameter_types}; use frame_support::traits::Get; -use frame_support::weights::{Weight, DispatchInfo}; +use frame_support::weights::{Weight, DispatchInfo, IdentityFee}; use std::cell::RefCell; use crate::{GenesisConfig, Module, Trait, decl_tests, tests::CallWithDispatchInfo}; @@ -87,7 +87,7 @@ impl pallet_transaction_payment::Trait for Test { type Currency = Module; type OnTransactionPayment = (); type TransactionByteFee = TransactionByteFee; - type WeightToFee = ConvertInto; + type WeightToFee = IdentityFee; type FeeMultiplierUpdate = (); } impl Trait for Test { diff --git a/frame/balances/src/tests_local.rs b/frame/balances/src/tests_local.rs index 4b0700748c..9ff76839f4 100644 --- a/frame/balances/src/tests_local.rs +++ b/frame/balances/src/tests_local.rs @@ -21,14 +21,14 @@ use sp_runtime::{ Perbill, - traits::{ConvertInto, IdentityLookup}, + traits::IdentityLookup, testing::Header, }; use sp_core::H256; use sp_io; use frame_support::{impl_outer_origin, parameter_types}; use frame_support::traits::{Get, StorageMapShim}; -use frame_support::weights::{Weight, DispatchInfo}; +use frame_support::weights::{Weight, DispatchInfo, IdentityFee}; use std::cell::RefCell; use crate::{GenesisConfig, Module, Trait, decl_tests, tests::CallWithDispatchInfo}; @@ -87,7 +87,7 @@ impl pallet_transaction_payment::Trait for Test { type Currency = Module; type OnTransactionPayment = (); type TransactionByteFee = TransactionByteFee; - type WeightToFee = ConvertInto; + type WeightToFee = IdentityFee; type FeeMultiplierUpdate = (); } impl Trait for Test { diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 4dfaa8035f..23c0417dac 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -37,7 +37,7 @@ use frame_support::{ assert_ok, assert_err, assert_err_ignore_postinfo, impl_outer_dispatch, impl_outer_event, impl_outer_origin, parameter_types, storage::child, StorageMap, StorageValue, traits::{Currency, Get}, - weights::{DispatchInfo, DispatchClass, Weight, PostDispatchInfo, Pays}, + weights::{DispatchInfo, DispatchClass, Weight, PostDispatchInfo, Pays, IdentityFee}, }; use std::{cell::RefCell, sync::atomic::{AtomicUsize, Ordering}}; use sp_core::storage::well_known_keys; @@ -152,7 +152,7 @@ impl pallet_transaction_payment::Trait for Test { type Currency = Balances; type OnTransactionPayment = (); type TransactionByteFee = TransactionByteFee; - type WeightToFee = Test; + type WeightToFee = IdentityFee>; type FeeMultiplierUpdate = (); } diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 9ac323828d..f7ac060a6c 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -454,12 +454,12 @@ mod tests { use sp_core::H256; use sp_runtime::{ generic::Era, Perbill, DispatchError, testing::{Digest, Header, Block}, - traits::{Header as HeaderT, BlakeTwo256, IdentityLookup, Convert, ConvertInto}, + traits::{Header as HeaderT, BlakeTwo256, IdentityLookup}, transaction_validity::{InvalidTransaction, UnknownTransaction, TransactionValidityError}, }; use frame_support::{ impl_outer_event, impl_outer_origin, parameter_types, impl_outer_dispatch, - weights::{Weight, RuntimeDbWeight}, + weights::{Weight, RuntimeDbWeight, IdentityFee, WeightToFeePolynomial}, traits::{Currency, LockIdentifier, LockableCurrency, WithdrawReasons, WithdrawReason}, }; use frame_system::{self as system, Call as SystemCall, ChainContext, LastRuntimeUpgradeInfo}; @@ -589,7 +589,7 @@ mod tests { type Currency = Balances; type OnTransactionPayment = (); type TransactionByteFee = TransactionByteFee; - type WeightToFee = ConvertInto; + type WeightToFee = IdentityFee; type FeeMultiplierUpdate = (); } impl custom::Trait for Runtime {} @@ -675,7 +675,8 @@ mod tests { }.assimilate_storage(&mut t).unwrap(); let xt = TestXt::new(Call::Balances(BalancesCall::transfer(2, 69)), sign_extra(1, 0, 0)); let weight = xt.get_dispatch_info().weight + ::ExtrinsicBaseWeight::get(); - let fee: Balance = ::WeightToFee::convert(weight); + let fee: Balance + = ::WeightToFee::calc(&weight); let mut t = sp_io::TestExternalities::new(t); t.execute_with(|| { Executive::initialize_block(&Header::new( @@ -871,7 +872,8 @@ mod tests { ); let weight = xt.get_dispatch_info().weight + ::ExtrinsicBaseWeight::get(); - let fee: Balance = ::WeightToFee::convert(weight); + let fee: Balance = + ::WeightToFee::calc(&weight); Executive::initialize_block(&Header::new( 1, H256::default(), diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 3213f0dfe4..61363be2df 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -29,6 +29,7 @@ once_cell = { version = "1", default-features = false, optional = true } sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } bitmask = { version = "0.5.0", default-features = false } impl-trait-for-tuples = "0.1.3" +smallvec = "1.4.0" [dev-dependencies] pretty_assertions = "0.6.1" diff --git a/frame/support/src/weights.rs b/frame/support/src/weights.rs index a0d150cbe9..771f908ecf 100644 --- a/frame/support/src/weights.rs +++ b/frame/support/src/weights.rs @@ -135,6 +135,9 @@ use sp_runtime::{ generic::{CheckedExtrinsic, UncheckedExtrinsic}, }; use crate::dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo, DispatchError}; +use sp_runtime::traits::SaturatedConversion; +use sp_arithmetic::{Perbill, traits::{BaseArithmetic, Saturating}}; +use smallvec::{smallvec, SmallVec}; /// Re-export priority as type pub use sp_runtime::transaction_validity::TransactionPriority; @@ -530,6 +533,90 @@ impl RuntimeDbWeight { } } +/// One coefficient and its position in the `WeightToFeePolynomial`. +/// +/// One term of polynomial is calculated as: +/// +/// ```ignore +/// coeff_integer * x^(degree) + coeff_frac * x^(degree) +/// ``` +/// +/// The `negative` value encodes whether the term is added or substracted from the +/// overall polynomial result. +#[derive(Clone, Encode, Decode)] +pub struct WeightToFeeCoefficient { + /// The integral part of the coefficient. + pub coeff_integer: Balance, + /// The fractional part of the coefficient. + pub coeff_frac: Perbill, + /// True iff the coefficient should be interpreted as negative. + pub negative: bool, + /// Degree/exponent of the term. + pub degree: u8, +} + +/// A list of coefficients that represent one polynomial. +pub type WeightToFeeCoefficients = SmallVec<[WeightToFeeCoefficient; 4]>; + +/// A trait that describes the weight to fee calculation as polynomial. +/// +/// An implementor should only implement the `polynomial` function. +pub trait WeightToFeePolynomial { + /// The type that is returned as result from polynomial evaluation. + type Balance: BaseArithmetic + From + Copy; + + /// Returns a polynomial that describes the weight to fee conversion. + /// + /// This is the only function that should be manually implemented. Please note + /// that all calculation is done in the probably unsigned `Balance` type. This means + /// that the order of coefficients is important as putting the negative coefficients + /// first will most likely saturate the result to zero mid evaluation. + fn polynomial() -> WeightToFeeCoefficients; + + /// Calculates the fee from the passed `weight` according to the `polynomial`. + /// + /// This should not be overriden in most circumstances. Calculation is done in the + /// `Balance` type and never overflows. All evaluation is saturating. + fn calc(weight: &Weight) -> Self::Balance { + Self::polynomial().iter().fold(Self::Balance::saturated_from(0u32), |mut acc, args| { + let w = Self::Balance::saturated_from(*weight).saturating_pow(args.degree.into()); + + // The sum could get negative. Therefore we only sum with the accumulator. + // The Perbill Mul implementation is non overflowing. + let frac = args.coeff_frac * w; + let integer = args.coeff_integer.saturating_mul(w); + + if args.negative { + acc = acc.saturating_sub(frac); + acc = acc.saturating_sub(integer); + } else { + acc = acc.saturating_add(frac); + acc = acc.saturating_add(integer); + } + + acc + }) + } +} + +/// Implementor of `WeightToFeePolynomial` that maps one unit of weight to one unit of fee. +pub struct IdentityFee(sp_std::marker::PhantomData); + +impl WeightToFeePolynomial for IdentityFee where + T: BaseArithmetic + From + Copy +{ + type Balance = T; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec!(WeightToFeeCoefficient { + coeff_integer: 1u32.into(), + coeff_frac: Perbill::zero(), + negative: false, + degree: 1, + }) + } +} + #[cfg(test)] #[allow(dead_code)] mod tests { @@ -651,4 +738,64 @@ mod tests { 1000 ); } + + type Balance = u64; + + // 0.5x^3 + 2.333x2 + 7x - 10_000 + struct Poly; + impl WeightToFeePolynomial for Poly { + type Balance = Balance; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec![ + WeightToFeeCoefficient { + coeff_integer: 0, + coeff_frac: Perbill::from_fraction(0.5), + negative: false, + degree: 3 + }, + WeightToFeeCoefficient { + coeff_integer: 2, + coeff_frac: Perbill::from_rational_approximation(1u32, 3u32), + negative: false, + degree: 2 + }, + WeightToFeeCoefficient { + coeff_integer: 7, + coeff_frac: Perbill::zero(), + negative: false, + degree: 1 + }, + WeightToFeeCoefficient { + coeff_integer: 10_000, + coeff_frac: Perbill::zero(), + negative: true, + degree: 0 + }, + ] + } + } + + #[test] + fn polynomial_works() { + assert_eq!(Poly::calc(&100), 514033); + assert_eq!(Poly::calc(&10_123), 518917034928); + } + + #[test] + fn polynomial_does_not_underflow() { + assert_eq!(Poly::calc(&0), 0); + } + + #[test] + fn polynomial_does_not_overflow() { + assert_eq!(Poly::calc(&Weight::max_value()), Balance::max_value() - 10_000); + } + + #[test] + fn identity_fee_works() { + assert_eq!(IdentityFee::::calc(&0), 0); + assert_eq!(IdentityFee::::calc(&50), 50); + assert_eq!(IdentityFee::::calc(&Weight::max_value()), Balance::max_value()); + } } diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index 0f8b05c3dd..56efe907f5 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -18,6 +18,7 @@ sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../pr frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "./rpc/runtime-api" } +smallvec = "1.4.0" [dev-dependencies] sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 17fe11db6c..71ef8a56c2 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -37,7 +37,10 @@ use codec::{Encode, Decode}; use frame_support::{ decl_storage, decl_module, traits::{Currency, Get, OnUnbalanced, ExistenceRequirement, WithdrawReason, Imbalance}, - weights::{Weight, DispatchInfo, PostDispatchInfo, GetDispatchInfo, Pays}, + weights::{ + Weight, DispatchInfo, PostDispatchInfo, GetDispatchInfo, Pays, WeightToFeePolynomial, + WeightToFeeCoefficient, + }, dispatch::DispatchResult, }; use sp_runtime::{ @@ -72,7 +75,7 @@ pub trait Trait: frame_system::Trait { type TransactionByteFee: Get>; /// Convert a weight value into a deductible fee based on the currency type. - type WeightToFee: Convert>; + type WeightToFee: WeightToFeePolynomial>; /// Update the multiplier of the next block, based on the previous block's weight. type FeeMultiplierUpdate: Convert; @@ -89,9 +92,13 @@ decl_module! { /// The fee to be paid for making a transaction; the per-byte portion. const TransactionByteFee: BalanceOf = T::TransactionByteFee::get(); + /// The polynomial that is applied in order to derive fee from weight. + const WeightToFee: Vec>> = + T::WeightToFee::polynomial().to_vec(); + fn on_finalize() { NextFeeMultiplier::mutate(|fm| { - *fm = T::FeeMultiplierUpdate::convert(*fm) + *fm = T::FeeMultiplierUpdate::convert(*fm); }); } } @@ -183,7 +190,7 @@ impl Module { // cap the weight to the maximum defined in runtime, otherwise it will be the // `Bounded` maximum of its data type, which is not desired. let capped_weight = weight.min(::MaximumBlockWeight::get()); - T::WeightToFee::convert(capped_weight) + T::WeightToFee::calc(&capped_weight) } } @@ -318,7 +325,10 @@ mod tests { use codec::Encode; use frame_support::{ impl_outer_dispatch, impl_outer_origin, parameter_types, - weights::{DispatchClass, DispatchInfo, PostDispatchInfo, GetDispatchInfo, Weight}, + weights::{ + DispatchClass, DispatchInfo, PostDispatchInfo, GetDispatchInfo, Weight, + WeightToFeePolynomial, WeightToFeeCoefficients, WeightToFeeCoefficient, + }, }; use pallet_balances::Call as BalancesCall; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; @@ -329,6 +339,7 @@ mod tests { Perbill, }; use std::cell::RefCell; + use smallvec::smallvec; const CALL: &::Call = &Call::Balances(BalancesCall::transfer(2, 69)); @@ -411,10 +422,17 @@ mod tests { fn get() -> u64 { TRANSACTION_BYTE_FEE.with(|v| *v.borrow()) } } - pub struct WeightToFee(u64); - impl Convert for WeightToFee { - fn convert(t: Weight) -> u64 { - WEIGHT_TO_FEE.with(|v| *v.borrow() * (t as u64)) + pub struct WeightToFee; + impl WeightToFeePolynomial for WeightToFee { + type Balance = u64; + + fn polynomial() -> WeightToFeeCoefficients { + smallvec![WeightToFeeCoefficient { + degree: 1, + coeff_frac: Perbill::zero(), + coeff_integer: WEIGHT_TO_FEE.with(|v| *v.borrow()), + negative: false, + }] } } -- GitLab From 1789c6d5983a23d66c59e9a5b6b2b00a0391e027 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 21 May 2020 13:50:37 +0200 Subject: [PATCH 091/150] Handle piping error for commands that output to stdout (#6098) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Handle piping error for commands that output to stdout * Apply suggestions from code review Co-authored-by: Bastian Köcher --- .gitignore | 1 + client/cli/src/commands/build_spec_cmd.rs | 7 ++++--- client/cli/src/commands/export_state_cmd.rs | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 6398c09fe7..353d49df28 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ rls*.log .local **/hfuzz_target/ **/hfuzz_workspace/ +.cargo/ diff --git a/client/cli/src/commands/build_spec_cmd.rs b/client/cli/src/commands/build_spec_cmd.rs index 2f9e2fa059..d2e2ef3a54 100644 --- a/client/cli/src/commands/build_spec_cmd.rs +++ b/client/cli/src/commands/build_spec_cmd.rs @@ -24,6 +24,7 @@ use log::info; use sc_network::config::build_multiaddr; use sc_service::{config::MultiaddrWithPeerId, Configuration}; use structopt::StructOpt; +use std::io::Write; /// The `build-spec` command used to build a specification. #[derive(Debug, StructOpt, Clone)] @@ -66,9 +67,9 @@ impl BuildSpecCmd { } let json = sc_service::chain_ops::build_spec(&*spec, raw_output)?; - - print!("{}", json); - + if std::io::stdout().write_all(json.as_bytes()).is_err() { + let _ = std::io::stderr().write_all(b"Error writing to stdout\n"); + } Ok(()) } } diff --git a/client/cli/src/commands/export_state_cmd.rs b/client/cli/src/commands/export_state_cmd.rs index 3ad6772882..33111e7737 100644 --- a/client/cli/src/commands/export_state_cmd.rs +++ b/client/cli/src/commands/export_state_cmd.rs @@ -22,7 +22,7 @@ use crate::{ use log::info; use sc_service::{Configuration, ServiceBuilderCommand}; use sp_runtime::traits::{Block as BlockT, NumberFor}; -use std::{fmt::Debug, str::FromStr}; +use std::{fmt::Debug, str::FromStr, io::Write}; use structopt::StructOpt; /// The `export-state` command used to export the state of a given block into @@ -65,9 +65,9 @@ impl ExportStateCmd { info!("Generating new chain spec..."); let json = sc_service::chain_ops::build_spec(&*input_spec, true)?; - - print!("{}", json); - + if std::io::stdout().write_all(json.as_bytes()).is_err() { + let _ = std::io::stderr().write_all(b"Error writing to stdout\n"); + } Ok(()) } } -- GitLab From 292a8a595d75405ce84e9278bda23839f744401a Mon Sep 17 00:00:00 2001 From: thiolliere Date: Thu, 21 May 2020 13:51:47 +0200 Subject: [PATCH 092/150] Allow operational recovery path if on_initialize use fullblock. (#6089) * note_preimage using operational * Update frame/democracy/src/lib.rs Co-authored-by: Gavin Wood --- bin/node/runtime/src/lib.rs | 1 + frame/democracy/src/lib.rs | 157 +++++++++++++++++--------- frame/democracy/src/tests.rs | 7 ++ frame/democracy/src/tests/preimage.rs | 40 ++++--- 4 files changed, 138 insertions(+), 67 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 209e86e747..2f8e393aa4 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -378,6 +378,7 @@ impl pallet_democracy::Trait for Runtime { type VetoOrigin = pallet_collective::EnsureMember; type CooloffPeriod = CooloffPeriod; type PreimageByteDeposit = PreimageByteDeposit; + type OperationalPreimageOrigin = pallet_collective::EnsureMember; type Slash = Treasury; type Scheduler = Scheduler; type MaxVotes = MaxVotes; diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index e0f1ec9b5c..039d48d75c 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -108,8 +108,10 @@ //! Preimage actions: //! - `note_preimage` - Registers the preimage for an upcoming proposal, requires //! a deposit that is returned once the proposal is enacted. +//! - `note_preimage_operational` - same but provided by `T::OperationalPreimageOrigin`. //! - `note_imminent_preimage` - Registers the preimage for an upcoming proposal. //! Does not require a deposit, but the proposal must be in the dispatch queue. +//! - `note_imminent_preimage_operational` - same but provided by `T::OperationalPreimageOrigin`. //! - `reap_preimage` - Removes the preimage for an expired proposal. Will only //! work under the condition that it's the same account that noted it and //! after the voting period, OR it's a different account after the enactment period. @@ -285,6 +287,9 @@ pub trait Trait: frame_system::Trait + Sized { /// The amount of balance that must be deposited per byte of preimage stored. type PreimageByteDeposit: Get>; + /// An origin that can provide a preimage using operational extrinsics. + type OperationalPreimageOrigin: EnsureOrigin; + /// Handler for the unbalanced reduction when slashing a preimage deposit. type Slash: OnUnbalanced>; @@ -542,7 +547,7 @@ mod weight_for { /// - Db writes per votes: `ReferendumInfoOf` /// - Base Weight: 65.78 + 8.229 * R µs // NOTE: weight must cover an incorrect voting of origin with 100 votes. - pub(crate) fn delegate(votes: Weight) -> Weight { + pub fn delegate(votes: Weight) -> Weight { T::DbWeight::get().reads_writes(votes.saturating_add(3), votes.saturating_add(3)) .saturating_add(66_000_000) .saturating_add(votes.saturating_mul(8_100_000)) @@ -554,7 +559,7 @@ mod weight_for { /// - Db reads per votes: `ReferendumInfoOf` /// - Db writes per votes: `ReferendumInfoOf` /// - Base Weight: 33.29 + 8.104 * R µs - pub(crate) fn undelegate(votes: Weight) -> Weight { + pub fn undelegate(votes: Weight) -> Weight { T::DbWeight::get().reads_writes(votes.saturating_add(2), votes.saturating_add(2)) .saturating_add(33_000_000) .saturating_add(votes.saturating_mul(8_000_000)) @@ -565,7 +570,7 @@ mod weight_for { /// - Db reads: `Proxy`, `proxy account` /// - Db writes: `proxy account` /// - Base Weight: 68.61 + 8.039 * R µs - pub(crate) fn proxy_delegate(votes: Weight) -> Weight { + pub fn proxy_delegate(votes: Weight) -> Weight { T::DbWeight::get().reads_writes(votes.saturating_add(5), votes.saturating_add(4)) .saturating_add(69_000_000) .saturating_add(votes.saturating_mul(8_000_000)) @@ -575,11 +580,37 @@ mod weight_for { /// same as `undelegate with additional: /// Db reads: `Proxy` /// Base Weight: 39 + 7.958 * R µs - pub(crate) fn proxy_undelegate(votes: Weight) -> Weight { + pub fn proxy_undelegate(votes: Weight) -> Weight { T::DbWeight::get().reads_writes(votes.saturating_add(3), votes.saturating_add(2)) .saturating_add(40_000_000) .saturating_add(votes.saturating_mul(8_000_000)) } + + /// Calculate the weight for `note_preimage`. + /// # + /// - Complexity: `O(E)` with E size of `encoded_proposal` (protected by a required deposit). + /// - Db reads: `Preimages` + /// - Db writes: `Preimages` + /// - Base Weight: 37.93 + .004 * b µs + /// # + pub fn note_preimage(encoded_proposal_len: Weight) -> Weight { + T::DbWeight::get().reads_writes(1, 1) + .saturating_add(38_000_000) + .saturating_add(encoded_proposal_len.saturating_mul(4_000)) + } + + /// Calculate the weight for `note_imminent_preimage`. + /// # + /// - Complexity: `O(E)` with E size of `encoded_proposal` (protected by a required deposit). + /// - Db reads: `Preimages` + /// - Db writes: `Preimages` + /// - Base Weight: 28.04 + .003 * b µs + /// # + pub fn note_imminent_preimage(encoded_proposal_len: Weight) -> Weight { + T::DbWeight::get().reads_writes(1, 1) + .saturating_add(28_000_000) + .saturating_add(encoded_proposal_len.saturating_mul(3_000)) + } } decl_module! { @@ -1157,33 +1188,21 @@ decl_module! { /// Emits `PreimageNoted`. /// /// # - /// - Complexity: `O(E)` with E size of `encoded_proposal` (protected by a required deposit). - /// - Db reads: `Preimages` - /// - Db writes: `Preimages` - /// - Base Weight: 37.93 + .004 * b µs + /// see `weight_for::note_preimage` /// # - #[weight = 38_000_000 + 4_000 * Weight::from(encoded_proposal.len() as u32) - + T::DbWeight::get().reads_writes(1, 1)] + #[weight = weight_for::note_preimage::((encoded_proposal.len() as u32).into())] fn note_preimage(origin, encoded_proposal: Vec) { - let who = ensure_signed(origin)?; - let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); - ensure!(!>::contains_key(&proposal_hash), Error::::DuplicatePreimage); - - let deposit = >::from(encoded_proposal.len() as u32) - .saturating_mul(T::PreimageByteDeposit::get()); - T::Currency::reserve(&who, deposit)?; - - let now = >::block_number(); - let a = PreimageStatus::Available { - data: encoded_proposal, - provider: who.clone(), - deposit, - since: now, - expiry: None, - }; - >::insert(proposal_hash, a); + Self::note_preimage_inner(ensure_signed(origin)?, encoded_proposal)?; + } - Self::deposit_event(RawEvent::PreimageNoted(proposal_hash, who, deposit)); + /// Same as `note_preimage` but origin is `OperationalPreimageOrigin`. + #[weight = ( + weight_for::note_preimage::((encoded_proposal.len() as u32).into()), + DispatchClass::Operational, + )] + fn note_preimage_operational(origin, encoded_proposal: Vec) { + let who = T::OperationalPreimageOrigin::ensure_origin(origin)?; + Self::note_preimage_inner(who, encoded_proposal)?; } /// Register the preimage for an upcoming proposal. This requires the proposal to be @@ -1196,32 +1215,21 @@ decl_module! { /// Emits `PreimageNoted`. /// /// # - /// - Complexity: `O(E)` with E size of `encoded_proposal` (protected by a required deposit). - /// - Db reads: `Preimages` - /// - Db writes: `Preimages` - /// - Base Weight: 28.04 + .003 * b µs + /// see `weight_for::note_preimage` /// # - #[weight = 28_000_000 + 3_000 * Weight::from(encoded_proposal.len() as u32) - + T::DbWeight::get().reads_writes(1, 1)] + #[weight = weight_for::note_imminent_preimage::((encoded_proposal.len() as u32).into())] fn note_imminent_preimage(origin, encoded_proposal: Vec) { - let who = ensure_signed(origin)?; - let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); - Self::check_pre_image_is_missing(proposal_hash)?; - let status = Preimages::::get(&proposal_hash).ok_or(Error::::NotImminent)?; - let expiry = status.to_missing_expiry().ok_or(Error::::DuplicatePreimage)?; - - let now = >::block_number(); - let free = >::zero(); - let a = PreimageStatus::Available { - data: encoded_proposal, - provider: who.clone(), - deposit: Zero::zero(), - since: now, - expiry: Some(expiry), - }; - >::insert(proposal_hash, a); + Self::note_imminent_preimage_inner(ensure_signed(origin)?, encoded_proposal)?; + } - Self::deposit_event(RawEvent::PreimageNoted(proposal_hash, who, free)); + /// Same as `note_imminent_preimage` but origin is `OperationalPreimageOrigin`. + #[weight = ( + weight_for::note_imminent_preimage::((encoded_proposal.len() as u32).into()), + DispatchClass::Operational, + )] + fn note_imminent_preimage_operational(origin, encoded_proposal: Vec) { + let who = T::OperationalPreimageOrigin::ensure_origin(origin)?; + Self::note_imminent_preimage_inner(who, encoded_proposal)?; } /// Remove an expired proposal preimage and collect the deposit. @@ -2030,6 +2038,53 @@ impl Module { Ok(len) } + + // See `note_preimage` + fn note_preimage_inner(who: T::AccountId, encoded_proposal: Vec) -> DispatchResult { + let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); + ensure!(!>::contains_key(&proposal_hash), Error::::DuplicatePreimage); + + let deposit = >::from(encoded_proposal.len() as u32) + .saturating_mul(T::PreimageByteDeposit::get()); + T::Currency::reserve(&who, deposit)?; + + let now = >::block_number(); + let a = PreimageStatus::Available { + data: encoded_proposal, + provider: who.clone(), + deposit, + since: now, + expiry: None, + }; + >::insert(proposal_hash, a); + + Self::deposit_event(RawEvent::PreimageNoted(proposal_hash, who, deposit)); + + Ok(()) + } + + // See `note_imminent_preimage` + fn note_imminent_preimage_inner(who: T::AccountId, encoded_proposal: Vec) -> DispatchResult { + let proposal_hash = T::Hashing::hash(&encoded_proposal[..]); + Self::check_pre_image_is_missing(proposal_hash)?; + let status = Preimages::::get(&proposal_hash).ok_or(Error::::NotImminent)?; + let expiry = status.to_missing_expiry().ok_or(Error::::DuplicatePreimage)?; + + let now = >::block_number(); + let free = >::zero(); + let a = PreimageStatus::Available { + data: encoded_proposal, + provider: who.clone(), + deposit: Zero::zero(), + since: now, + expiry: Some(expiry), + }; + >::insert(proposal_hash, a); + + Self::deposit_event(RawEvent::PreimageNoted(proposal_hash, who, free)); + + Ok(()) + } } /// Decode `Compact` from the trie at given key. diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index d039f3382f..c567aec0b6 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -187,6 +187,7 @@ impl super::Trait for Test { type InstantAllowed = InstantAllowed; type Scheduler = Scheduler; type MaxVotes = MaxVotes; + type OperationalPreimageOrigin = EnsureSignedBy; } pub fn new_test_ext() -> sp_io::TestExternalities { @@ -200,6 +201,12 @@ pub fn new_test_ext() -> sp_io::TestExternalities { ext } +/// Execute the function two times, with `true` and with `false`. +pub fn new_test_ext_execute_with_cond(execute: impl FnOnce(bool) -> () + Clone) { + new_test_ext().execute_with(|| (execute.clone())(false)); + new_test_ext().execute_with(|| execute(true)); +} + type System = frame_system::Module; type Balances = pallet_balances::Module; type Scheduler = pallet_scheduler::Module; diff --git a/frame/democracy/src/tests/preimage.rs b/frame/democracy/src/tests/preimage.rs index 094cde86d0..4100a6a6b6 100644 --- a/frame/democracy/src/tests/preimage.rs +++ b/frame/democracy/src/tests/preimage.rs @@ -39,13 +39,14 @@ fn missing_preimage_should_fail() { #[test] fn preimage_deposit_should_be_required_and_returned() { - new_test_ext().execute_with(|| { + new_test_ext_execute_with_cond(|operational| { // fee of 100 is too much. PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 100); assert_noop!( - Democracy::note_preimage(Origin::signed(6), vec![0; 500]), - BalancesError::::InsufficientBalance, - ); + if operational { Democracy::note_preimage_operational(Origin::signed(6), vec![0; 500]) } + else { Democracy::note_preimage(Origin::signed(6), vec![0; 500]) }, + BalancesError::::InsufficientBalance, + ); // fee of 1 is reasonable. PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 1); let r = Democracy::inject_referendum( @@ -69,17 +70,20 @@ fn preimage_deposit_should_be_required_and_returned() { #[test] fn preimage_deposit_should_be_reapable_earlier_by_owner() { - new_test_ext().execute_with(|| { + new_test_ext_execute_with_cond(|operational| { PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 1); - assert_ok!(Democracy::note_preimage(Origin::signed(6), set_balance_proposal(2))); + assert_ok!( + if operational { Democracy::note_preimage_operational(Origin::signed(6), set_balance_proposal(2)) } + else { Democracy::note_preimage(Origin::signed(6), set_balance_proposal(2)) } + ); assert_eq!(Balances::reserved_balance(6), 12); next_block(); assert_noop!( - Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2), u32::max_value()), - Error::::TooEarly - ); + Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2), u32::max_value()), + Error::::TooEarly + ); next_block(); assert_ok!(Democracy::reap_preimage(Origin::signed(6), set_balance_proposal_hash(2), u32::max_value())); @@ -90,14 +94,17 @@ fn preimage_deposit_should_be_reapable_earlier_by_owner() { #[test] fn preimage_deposit_should_be_reapable() { - new_test_ext().execute_with(|| { + new_test_ext_execute_with_cond(|operational| { assert_noop!( Democracy::reap_preimage(Origin::signed(5), set_balance_proposal_hash(2), u32::max_value()), Error::::PreimageMissing ); PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 1); - assert_ok!(Democracy::note_preimage(Origin::signed(6), set_balance_proposal(2))); + assert_ok!( + if operational { Democracy::note_preimage_operational(Origin::signed(6), set_balance_proposal(2)) } + else { Democracy::note_preimage(Origin::signed(6), set_balance_proposal(2)) } + ); assert_eq!(Balances::reserved_balance(6), 12); next_block(); @@ -118,7 +125,7 @@ fn preimage_deposit_should_be_reapable() { #[test] fn noting_imminent_preimage_for_free_should_work() { - new_test_ext().execute_with(|| { + new_test_ext_execute_with_cond(|operational| { PREIMAGE_BYTE_DEPOSIT.with(|v| *v.borrow_mut() = 1); let r = Democracy::inject_referendum( @@ -130,14 +137,15 @@ fn noting_imminent_preimage_for_free_should_work() { assert_ok!(Democracy::vote(Origin::signed(1), r, aye(1))); assert_noop!( - Democracy::note_imminent_preimage(Origin::signed(7), set_balance_proposal(2)), - Error::::NotImminent - ); + if operational { Democracy::note_imminent_preimage_operational(Origin::signed(6), set_balance_proposal(2)) } + else { Democracy::note_imminent_preimage(Origin::signed(6), set_balance_proposal(2)) }, + Error::::NotImminent + ); next_block(); // Now we're in the dispatch queue it's all good. - assert_ok!(Democracy::note_imminent_preimage(Origin::signed(7), set_balance_proposal(2))); + assert_ok!(Democracy::note_imminent_preimage(Origin::signed(6), set_balance_proposal(2))); next_block(); -- GitLab From 075ef1cac7caa78df134dc0da458aa202556c3b5 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 21 May 2020 13:54:50 +0200 Subject: [PATCH 093/150] Optimize network poll (#6099) --- .../src/protocol/generic_proto/behaviour.rs | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index 9d48d40bdf..b3c209eb0c 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -1364,10 +1364,9 @@ impl NetworkBehaviour for GenericProto { } for (peer_id, peer_state) in self.peers.iter_mut() { - match mem::replace(peer_state, PeerState::Poisoned) { - PeerState::PendingRequest { mut timer, timer_deadline } => { - if let Poll::Pending = Pin::new(&mut timer).poll(cx) { - *peer_state = PeerState::PendingRequest { timer, timer_deadline }; + match peer_state { + PeerState::PendingRequest { timer, .. } => { + if let Poll::Pending = Pin::new(timer).poll(cx) { continue; } @@ -1379,17 +1378,8 @@ impl NetworkBehaviour for GenericProto { *peer_state = PeerState::Requested; } - PeerState::DisabledPendingEnable { - mut timer, - open, - timer_deadline - } => { - if let Poll::Pending = Pin::new(&mut timer).poll(cx) { - *peer_state = PeerState::DisabledPendingEnable { - timer, - open, - timer_deadline - }; + PeerState::DisabledPendingEnable { timer, open, .. } => { + if let Poll::Pending = Pin::new(timer).poll(cx) { continue; } @@ -1399,10 +1389,9 @@ impl NetworkBehaviour for GenericProto { handler: NotifyHandler::All, event: NotifsHandlerIn::Enable, }); - *peer_state = PeerState::Enabled { open }; + *peer_state = PeerState::Enabled { open: mem::replace(open, Default::default()) }; } - - st => *peer_state = st, + _ => {}, } } -- GitLab From 28ff83aed9331aabd9ab05f759017889c30deca5 Mon Sep 17 00:00:00 2001 From: mattrutherford <44339188+mattrutherford@users.noreply.github.com> Date: Thu, 21 May 2020 12:55:00 +0100 Subject: [PATCH 094/150] Increase precision of benchmarking results summary (#6092) Co-authored-by: Matt Rutherford --- bin/node/bench/src/core.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/node/bench/src/core.rs b/bin/node/bench/src/core.rs index a3c25f9ce3..c1b1711549 100644 --- a/bin/node/bench/src/core.rs +++ b/bin/node/bench/src/core.rs @@ -75,14 +75,14 @@ impl fmt::Display for NsFormatter { } if self.0 < 1_000_000 { - return write!(f, "{:.2} ms", v as f64 / 1_000_000.0) + return write!(f, "{:.4} ms", v as f64 / 1_000_000.0) } if self.0 < 100_000_000 { - return write!(f, "{} ms", v as f64 / 1_000_000.0) + return write!(f, "{:.1} ms", v as f64 / 1_000_000.0) } - write!(f, "{:.2} s", v as f64 / 1_000_000_000.0) + write!(f, "{:.4} s", v as f64 / 1_000_000_000.0) } } -- GitLab From 73ff9385303dc06665c9753ec3e7303647e3b8bc Mon Sep 17 00:00:00 2001 From: Demi Obenour Date: Thu, 21 May 2020 11:57:29 +0000 Subject: [PATCH 095/150] Add notes about safe uses of twox (#6082) * Add notes about safe uses of twox * Update frame/grandpa/src/lib.rs Co-authored-by: Nikolay Volf * Update frame/elections/src/lib.rs * Apply suggestions from code review Co-authored-by: Gavin Wood Co-authored-by: Nikolay Volf --- frame/assets/src/lib.rs | 2 ++ frame/babe/src/lib.rs | 2 ++ frame/contracts/src/lib.rs | 2 ++ frame/democracy/src/lib.rs | 10 ++++++++++ frame/elections-phragmen/src/lib.rs | 2 ++ frame/elections/src/lib.rs | 9 +++++++++ frame/generic-asset/src/lib.rs | 8 ++++++++ frame/grandpa/src/lib.rs | 2 ++ frame/identity/src/lib.rs | 4 ++++ 9 files changed, 41 insertions(+) diff --git a/frame/assets/src/lib.rs b/frame/assets/src/lib.rs index 48806e30cd..2c67a320c1 100644 --- a/frame/assets/src/lib.rs +++ b/frame/assets/src/lib.rs @@ -257,6 +257,8 @@ decl_storage! { /// The next asset identifier up for grabs. NextAssetId get(fn next_asset_id): T::AssetId; /// The total unit supply of an asset. + /// + /// TWOX-NOTE: `AssetId` is trusted, so this is safe. TotalSupply: map hasher(twox_64_concat) T::AssetId => T::Balance; } } diff --git a/frame/babe/src/lib.rs b/frame/babe/src/lib.rs index 153ff0e992..9142173932 100644 --- a/frame/babe/src/lib.rs +++ b/frame/babe/src/lib.rs @@ -152,6 +152,8 @@ decl_storage! { /// We reset all segments and return to `0` at the beginning of every /// epoch. SegmentIndex build(|_| 0): u32; + + /// TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay. UnderConstruction: map hasher(twox_64_concat) u32 => Vec; /// Temporary value (cleared at block finalization) which is `Some` diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index df53cf0a0e..509229cd96 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -836,6 +836,8 @@ decl_storage! { /// The subtrie counter. pub AccountCounter: u64 = 0; /// The code associated with a given account. + /// + /// TWOX-NOTE: SAFE since `AccountId` is a secure hash. pub ContractInfoOf: map hasher(twox_64_concat) T::AccountId => Option>; } } diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index 039d48d75c..ee9417ce0c 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -344,6 +344,8 @@ decl_storage! { /// The public proposals. Unsorted. The second item is the proposal's hash. pub PublicProps get(fn public_props): Vec<(PropIndex, T::Hash, T::AccountId)>; /// Those who have locked a deposit. + /// + /// TWOX-NOTE: Safe, as increasing integer keys are safe. pub DepositOf get(fn deposit_of): map hasher(twox_64_concat) PropIndex => Option<(Vec, BalanceOf)>; @@ -362,22 +364,30 @@ decl_storage! { pub LowestUnbaked get(fn lowest_unbaked) build(|_| 0 as ReferendumIndex): ReferendumIndex; /// Information concerning any given referendum. + /// + /// TWOX-NOTE: SAFE as indexes are not under an attacker’s control. pub ReferendumInfoOf get(fn referendum_info): map hasher(twox_64_concat) ReferendumIndex => Option>>; /// All votes for a particular voter. We store the balance for the number of votes that we /// have recorded. The second item is the total amount of delegations, that will be added. + /// + /// TWOX-NOTE: SAFE as `AccountId`s are crypto hashes anyway. pub VotingOf: map hasher(twox_64_concat) T::AccountId => Voting, T::AccountId, T::BlockNumber>; /// Who is able to vote for whom. Value is the fund-holding account, key is the /// vote-transaction-sending account. + /// + /// TWOX-NOTE: OK ― `AccountId` is a secure hash. // TODO: Refactor proxy into its own pallet. // https://github.com/paritytech/substrate/issues/5322 pub Proxy get(fn proxy): map hasher(twox_64_concat) T::AccountId => Option>; /// Accounts for which there are locks in action which may be removed at some point in the /// future. The value is the block number at which the lock expires and may be removed. + /// + /// TWOX-NOTE: OK ― `AccountId` is a secure hash. pub Locks get(fn locks): map hasher(twox_64_concat) T::AccountId => Option; /// True if the last referendum tabled was submitted externally. False if it was a public diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 0c35283e1a..5d7d2bf503 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -197,6 +197,8 @@ decl_storage! { pub ElectionRounds get(fn election_rounds): u32 = Zero::zero(); /// Votes and locked stake of a particular voter. + /// + /// TWOX-NOTE: SAFE as `AccountId` is a crypto hash pub Voting get(fn voting): map hasher(twox_64_concat) T::AccountId => (BalanceOf, Vec); /// The present candidate list. Sorted based on account-id. A current member or runner-up diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index b87db45909..1085831373 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -237,16 +237,25 @@ decl_storage! { // bit-wise manner. In order to get a human-readable representation (`Vec`), use // [`all_approvals_of`]. Furthermore, each vector of scalars is chunked with the cap of // `APPROVAL_SET_SIZE`. + /// + /// TWOX-NOTE: SAFE as `AccountId` is a crypto hash and `SetIndex` is not + /// attacker-controlled. pub ApprovalsOf get(fn approvals_of): map hasher(twox_64_concat) (T::AccountId, SetIndex) => Vec; /// The vote index and list slot that the candidate `who` was registered or `None` if they /// are not currently registered. + /// + /// TWOX-NOTE: SAFE as `AccountId` is a crypto hash. pub RegisterInfoOf get(fn candidate_reg_info): map hasher(twox_64_concat) T::AccountId => Option<(VoteIndex, u32)>; /// Basic information about a voter. + /// + /// TWOX-NOTE: SAFE as `AccountId` is a crypto hash. pub VoterInfoOf get(fn voter_info): map hasher(twox_64_concat) T::AccountId => Option>>; /// The present voter list (chunked and capped at [`VOTER_SET_SIZE`]). + /// + /// TWOX-NOTE: OKAY ― `SetIndex` is not user-controlled data. pub Voters get(fn voters): map hasher(twox_64_concat) SetIndex => Vec>; /// the next free set to store a voter in. This will keep growing. pub NextVoterSet get(fn next_nonfull_voter_set): SetIndex = 0; diff --git a/frame/generic-asset/src/lib.rs b/frame/generic-asset/src/lib.rs index 646e217366..f94c83b5ed 100644 --- a/frame/generic-asset/src/lib.rs +++ b/frame/generic-asset/src/lib.rs @@ -442,16 +442,22 @@ pub struct BalanceLock { decl_storage! { trait Store for Module as GenericAsset { /// Total issuance of a given asset. + /// + /// TWOX-NOTE: `AssetId` is trusted. pub TotalIssuance get(fn total_issuance) build(|config: &GenesisConfig| { let issuance = config.initial_balance * (config.endowed_accounts.len() as u32).into(); config.assets.iter().map(|id| (id.clone(), issuance)).collect::>() }): map hasher(twox_64_concat) T::AssetId => T::Balance; /// The free balance of a given asset under an account. + /// + /// TWOX-NOTE: `AssetId` is trusted. pub FreeBalance: double_map hasher(twox_64_concat) T::AssetId, hasher(blake2_128_concat) T::AccountId => T::Balance; /// The reserved balance of a given asset under an account. + /// + /// TWOX-NOTE: `AssetId` is trusted. pub ReservedBalance: double_map hasher(twox_64_concat) T::AssetId, hasher(blake2_128_concat) T::AccountId => T::Balance; @@ -459,6 +465,8 @@ decl_storage! { pub NextAssetId get(fn next_asset_id) config(): T::AssetId; /// Permission options for a given asset. + /// + /// TWOX-NOTE: `AssetId` is trusted. pub Permissions get(fn get_permission): map hasher(twox_64_concat) T::AssetId => PermissionVersions; diff --git a/frame/grandpa/src/lib.rs b/frame/grandpa/src/lib.rs index 43b6ba0b2f..3432c11020 100644 --- a/frame/grandpa/src/lib.rs +++ b/frame/grandpa/src/lib.rs @@ -212,6 +212,8 @@ decl_storage! { /// A mapping from grandpa set ID to the index of the *most recent* session for which its /// members were responsible. + /// + /// TWOX-NOTE: `SetId` is not under user control. SetIdSession get(fn session_for_set): map hasher(twox_64_concat) SetId => Option; } add_extra_genesis { diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index 6a69797c90..2b58437685 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -389,6 +389,8 @@ pub struct RegistrarInfo< decl_storage! { trait Store for Module as Identity { /// Information that is pertinent to identify the entity behind an account. + /// + /// TWOX-NOTE: OK ― `AccountId` is a secure hash. pub IdentityOf get(fn identity): map hasher(twox_64_concat) T::AccountId => Option>>; @@ -400,6 +402,8 @@ decl_storage! { /// Alternative "sub" identities of this account. /// /// The first item is the deposit, the second is a vector of the accounts. + /// + /// TWOX-NOTE: OK ― `AccountId` is a secure hash. pub SubsOf get(fn subs_of): map hasher(twox_64_concat) T::AccountId => (BalanceOf, Vec); -- GitLab From 14d89b7bff014f22ba5ab081c9552c34abc3ce10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Thu, 21 May 2020 12:58:04 +0100 Subject: [PATCH 096/150] babe: treat epoch_authorship RPC method as unsafe (#6069) * service: pass DenyUnsafe to rpc extensions * node: add DenyUnsafe to rpc full node dependencies * client: fix whitespace in rpc policy file * babe: treat epochAuthorship rpc method as unsafe * babe: add test for unsafe rpc method * babe: rename babe rpc handler * service: traitify rpc extension builder * service: make the rpc extensions builder api non-breaking * service: revert changes from light node rpc extensions builder * node: remove unnecessary type in service creation * service: cleanup with_rpc_extensions implementation * service: add missing docs to RpcExtensionBuilder --- Cargo.lock | 4 + bin/node/cli/src/service.rs | 65 +++++++++------ bin/node/rpc/Cargo.toml | 1 + bin/node/rpc/src/lib.rs | 15 +++- client/consensus/babe/rpc/Cargo.toml | 5 +- client/consensus/babe/rpc/src/lib.rs | 56 +++++++++++-- client/rpc-api/src/policy.rs | 36 ++++----- client/service/src/builder.rs | 115 ++++++++++++++++++++++----- client/service/src/lib.rs | 2 +- 9 files changed, 223 insertions(+), 76 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8bd5963b81..6674b8d3ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3567,6 +3567,7 @@ dependencies = [ "sc-finality-grandpa", "sc-finality-grandpa-rpc", "sc-keystore", + "sc-rpc-api", "sp-api", "sp-blockchain", "sp-consensus", @@ -6165,10 +6166,13 @@ dependencies = [ "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", + "sc-consensus", "sc-consensus-babe", "sc-consensus-epochs", "sc-keystore", + "sc-rpc-api", "serde", + "serde_json", "sp-api", "sp-application-crypto", "sp-blockchain", diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index 7798404ff9..b738b5cf1f 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -43,7 +43,6 @@ macro_rules! new_full_start { ($config:expr) => {{ use std::sync::Arc; - type RpcExtension = jsonrpc_core::IoHandler; let mut import_setup = None; let mut rpc_setup = None; let inherent_data_providers = sp_inherents::InherentDataProviders::new(); @@ -99,30 +98,46 @@ macro_rules! new_full_start { import_setup = Some((block_import, grandpa_link, babe_link)); Ok(import_queue) })? - .with_rpc_extensions(|builder| -> std::result::Result { - let babe_link = import_setup.as_ref().map(|s| &s.2) - .expect("BabeLink is present for full services or set up failed; qed."); + .with_rpc_extensions_builder(|builder| { let grandpa_link = import_setup.as_ref().map(|s| &s.1) .expect("GRANDPA LinkHalf is present for full services or set up failed; qed."); - let shared_authority_set = grandpa_link.shared_authority_set(); + + let shared_authority_set = grandpa_link.shared_authority_set().clone(); let shared_voter_state = grandpa::SharedVoterState::empty(); - let deps = node_rpc::FullDeps { - client: builder.client().clone(), - pool: builder.pool(), - select_chain: builder.select_chain().cloned() - .expect("SelectChain is present for full services or set up failed; qed."), - babe: node_rpc::BabeDeps { - keystore: builder.keystore(), - babe_config: sc_consensus_babe::BabeLink::config(babe_link).clone(), - shared_epoch_changes: sc_consensus_babe::BabeLink::epoch_changes(babe_link).clone() - }, - grandpa: node_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - }, - }; - rpc_setup = Some((shared_voter_state)); - Ok(node_rpc::create_full(deps)) + + rpc_setup = Some((shared_voter_state.clone())); + + let babe_link = import_setup.as_ref().map(|s| &s.2) + .expect("BabeLink is present for full services or set up failed; qed."); + + let babe_config = babe_link.config().clone(); + let shared_epoch_changes = babe_link.epoch_changes().clone(); + + let client = builder.client().clone(); + let pool = builder.pool().clone(); + let select_chain = builder.select_chain().cloned() + .expect("SelectChain is present for full services or set up failed; qed."); + let keystore = builder.keystore().clone(); + + Ok(move |deny_unsafe| { + let deps = node_rpc::FullDeps { + client: client.clone(), + pool: pool.clone(), + select_chain: select_chain.clone(), + deny_unsafe, + babe: node_rpc::BabeDeps { + babe_config: babe_config.clone(), + shared_epoch_changes: shared_epoch_changes.clone(), + keystore: keystore.clone(), + }, + grandpa: node_rpc::GrandpaDeps { + shared_voter_state: shared_voter_state.clone(), + shared_authority_set: shared_authority_set.clone(), + }, + }; + + node_rpc::create_full(deps) + }) })?; (builder, import_setup, inherent_data_providers, rpc_setup) @@ -302,7 +317,6 @@ pub fn new_full(config: Configuration) /// Builds a new service for a light client. pub fn new_light(config: Configuration) -> Result { - type RpcExtension = jsonrpc_core::IoHandler; let inherent_data_providers = InherentDataProviders::new(); let service = ServiceBuilder::new_light::(config)? @@ -366,9 +380,7 @@ pub fn new_light(config: Configuration) let provider = client as Arc>; Ok(Arc::new(GrandpaFinalityProofProvider::new(backend, provider)) as _) })? - .with_rpc_extensions(|builder,| -> - Result - { + .with_rpc_extensions(|builder| { let fetcher = builder.fetcher() .ok_or_else(|| "Trying to start node RPC without active fetcher")?; let remote_blockchain = builder.remote_backend() @@ -380,6 +392,7 @@ pub fn new_light(config: Configuration) client: builder.client().clone(), pool: builder.pool(), }; + Ok(node_rpc::create_light(light_deps)) })? .build()?; diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index ef948cd009..5eb0d271b9 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -30,3 +30,4 @@ sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/co sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } sc-finality-grandpa-rpc = { version = "0.8.0-dev", path = "../../../client/finality-grandpa/rpc" } +sc-rpc-api = { version = "0.8.0-dev", path = "../../../client/rpc-api" } diff --git a/bin/node/rpc/src/lib.rs b/bin/node/rpc/src/lib.rs index 02cb44d402..259a792441 100644 --- a/bin/node/rpc/src/lib.rs +++ b/bin/node/rpc/src/lib.rs @@ -42,9 +42,10 @@ use sc_keystore::KeyStorePtr; use sp_consensus_babe::BabeApi; use sc_consensus_epochs::SharedEpochChanges; use sc_consensus_babe::{Config, Epoch}; -use sc_consensus_babe_rpc::BabeRPCHandler; +use sc_consensus_babe_rpc::BabeRpcHandler; use sc_finality_grandpa::{SharedVoterState, SharedAuthoritySet}; use sc_finality_grandpa_rpc::GrandpaRpcHandler; +use sc_rpc_api::DenyUnsafe; /// Light client extra dependencies. pub struct LightDeps { @@ -84,6 +85,8 @@ pub struct FullDeps { pub pool: Arc

, /// The SelectChain Strategy pub select_chain: SC, + /// Whether to deny unsafe calls + pub deny_unsafe: DenyUnsafe, /// BABE specific dependencies. pub babe: BabeDeps, /// GRANDPA specific dependencies. @@ -115,6 +118,7 @@ pub fn create_full( client, pool, select_chain, + deny_unsafe, babe, grandpa, } = deps; @@ -142,7 +146,14 @@ pub fn create_full( ); io.extend_with( sc_consensus_babe_rpc::BabeApi::to_delegate( - BabeRPCHandler::new(client, shared_epoch_changes, keystore, babe_config, select_chain) + BabeRpcHandler::new( + client, + shared_epoch_changes, + keystore, + babe_config, + select_chain, + deny_unsafe, + ), ) ); io.extend_with( diff --git a/client/consensus/babe/rpc/Cargo.toml b/client/consensus/babe/rpc/Cargo.toml index 2a0762e1a8..900e29bfba 100644 --- a/client/consensus/babe/rpc/Cargo.toml +++ b/client/consensus/babe/rpc/Cargo.toml @@ -13,6 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sc-consensus-babe = { version = "0.8.0-dev", path = "../" } +sc-rpc-api = { version = "0.8.0-dev", path = "../../../rpc-api" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" @@ -29,7 +30,9 @@ sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } sc-keystore = { version = "2.0.0-dev", path = "../../../keystore" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } +sc-consensus = { version = "0.8.0-dev", path = "../../../consensus/common" } +serde_json = "1.0.50" sp-application-crypto = { version = "2.0.0-dev", path = "../../../../primitives/application-crypto" } sp-keyring = { version = "2.0.0-dev", path = "../../../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } tempfile = "3.1.0" diff --git a/client/consensus/babe/rpc/src/lib.rs b/client/consensus/babe/rpc/src/lib.rs index 925328a856..8e1282a8d7 100644 --- a/client/consensus/babe/rpc/src/lib.rs +++ b/client/consensus/babe/rpc/src/lib.rs @@ -33,6 +33,7 @@ use sp_consensus_babe::{ }; use serde::{Deserialize, Serialize}; use sc_keystore::KeyStorePtr; +use sc_rpc_api::DenyUnsafe; use sp_api::{ProvideRuntimeApi, BlockId}; use sp_runtime::traits::{Block as BlockT, Header as _}; use sp_consensus::{SelectChain, Error as ConsensusError}; @@ -50,8 +51,8 @@ pub trait BabeApi { fn epoch_authorship(&self) -> FutureResult>; } -/// Implements the BabeRPC trait for interacting with Babe. -pub struct BabeRPCHandler { +/// Implements the BabeRpc trait for interacting with Babe. +pub struct BabeRpcHandler { /// shared reference to the client. client: Arc, /// shared reference to EpochChanges @@ -62,9 +63,11 @@ pub struct BabeRPCHandler { babe_config: Config, /// The SelectChain strategy select_chain: SC, + /// Whether to deny unsafe calls + deny_unsafe: DenyUnsafe, } -impl BabeRPCHandler { +impl BabeRpcHandler { /// Creates a new instance of the BabeRpc handler. pub fn new( client: Arc, @@ -72,6 +75,7 @@ impl BabeRPCHandler { keystore: KeyStorePtr, babe_config: Config, select_chain: SC, + deny_unsafe: DenyUnsafe, ) -> Self { Self { client, @@ -79,11 +83,12 @@ impl BabeRPCHandler { keystore, babe_config, select_chain, + deny_unsafe, } } } -impl BabeApi for BabeRPCHandler +impl BabeApi for BabeRpcHandler where B: BlockT, C: ProvideRuntimeApi + HeaderBackend + HeaderMetadata + 'static, @@ -92,6 +97,10 @@ impl BabeApi for BabeRPCHandler SC: SelectChain + Clone + 'static, { fn epoch_authorship(&self) -> FutureResult> { + if let Err(err) = self.deny_unsafe.check_if_safe() { + return Box::new(rpc_future::err(err.into())); + } + let ( babe_config, keystore, @@ -214,7 +223,10 @@ fn epoch_data( mod tests { use super::*; use substrate_test_runtime_client::{ + runtime::Block, + Backend, DefaultTestClientBuilderExt, + TestClient, TestClientBuilderExt, TestClientBuilder, }; @@ -236,8 +248,9 @@ mod tests { (keystore, keystore_path) } - #[test] - fn rpc() { + fn test_babe_rpc_handler( + deny_unsafe: DenyUnsafe + ) -> BabeRpcHandler> { let builder = TestClientBuilder::new(); let (client, longest_chain) = builder.build_with_longest_chain(); let client = Arc::new(client); @@ -249,9 +262,21 @@ mod tests { ).expect("can initialize block-import"); let epoch_changes = link.epoch_changes().clone(); - let select_chain = longest_chain; let keystore = create_temp_keystore::(Ed25519Keyring::Alice).0; - let handler = BabeRPCHandler::new(client.clone(), epoch_changes, keystore, config, select_chain); + + BabeRpcHandler::new( + client.clone(), + epoch_changes, + keystore, + config, + longest_chain, + deny_unsafe, + ) + } + + #[test] + fn epoch_authorship_works() { + let handler = test_babe_rpc_handler(DenyUnsafe::No); let mut io = IoHandler::new(); io.extend_with(BabeApi::to_delegate(handler)); @@ -260,4 +285,19 @@ mod tests { assert_eq!(Some(response.into()), io.handle_request_sync(request)); } + + #[test] + fn epoch_authorship_is_unsafe() { + let handler = test_babe_rpc_handler(DenyUnsafe::Yes); + let mut io = IoHandler::new(); + + io.extend_with(BabeApi::to_delegate(handler)); + let request = r#"{"jsonrpc":"2.0","method":"babe_epochAuthorship","params": [],"id":1}"#; + + let response = io.handle_request_sync(request).unwrap(); + let mut response: serde_json::Value = serde_json::from_str(&response).unwrap(); + let error: RpcError = serde_json::from_value(response["error"].take()).unwrap(); + + assert_eq!(error, RpcError::method_not_found()) + } } diff --git a/client/rpc-api/src/policy.rs b/client/rpc-api/src/policy.rs index e6e3380e1a..141dcfbc41 100644 --- a/client/rpc-api/src/policy.rs +++ b/client/rpc-api/src/policy.rs @@ -26,21 +26,21 @@ use jsonrpc_core as rpc; /// Signifies whether a potentially unsafe RPC should be denied. #[derive(Clone, Copy, Debug)] pub enum DenyUnsafe { - /// Denies only potentially unsafe RPCs. - Yes, - /// Allows calling every RPCs. - No + /// Denies only potentially unsafe RPCs. + Yes, + /// Allows calling every RPCs. + No, } impl DenyUnsafe { - /// Returns `Ok(())` if the RPCs considered unsafe are safe to call, - /// otherwise returns `Err(UnsafeRpcError)`. - pub fn check_if_safe(self) -> Result<(), UnsafeRpcError> { - match self { - DenyUnsafe::Yes => Err(UnsafeRpcError), - DenyUnsafe::No => Ok(()) - } - } + /// Returns `Ok(())` if the RPCs considered unsafe are safe to call, + /// otherwise returns `Err(UnsafeRpcError)`. + pub fn check_if_safe(self) -> Result<(), UnsafeRpcError> { + match self { + DenyUnsafe::Yes => Err(UnsafeRpcError), + DenyUnsafe::No => Ok(()), + } + } } /// Signifies whether an RPC considered unsafe is denied to be called externally. @@ -48,15 +48,15 @@ impl DenyUnsafe { pub struct UnsafeRpcError; impl std::fmt::Display for UnsafeRpcError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "RPC call is unsafe to be called externally") - } + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "RPC call is unsafe to be called externally") + } } impl std::error::Error for UnsafeRpcError {} impl From for rpc::Error { - fn from(_: UnsafeRpcError) -> rpc::Error { - rpc::Error::method_not_found() - } + fn from(_: UnsafeRpcError) -> rpc::Error { + rpc::Error::method_not_found() + } } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index cc7929e88c..16d78c49e1 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -96,12 +96,61 @@ pub struct ServiceBuilder, finality_proof_provider: Option, transaction_pool: Arc, - rpc_extensions: TRpc, + rpc_extensions_builder: Box + Send>, remote_backend: Option>>, marker: PhantomData<(TBl, TRtApi)>, block_announce_validator_builder: Option) -> Box + Send> + Send>>, } +/// A utility trait for building an RPC extension given a `DenyUnsafe` instance. +/// This is useful since at service definition time we don't know whether the +/// specific interface where the RPC extension will be exposed is safe or not. +/// This trait allows us to lazily build the RPC extension whenever we bind the +/// service to an interface. +pub trait RpcExtensionBuilder { + /// The type of the RPC extension that will be built. + type Output: sc_rpc::RpcExtension; + + /// Returns an instance of the RPC extension for a particular `DenyUnsafe` + /// value, e.g. the RPC extension might not expose some unsafe methods. + fn build(&self, deny: sc_rpc::DenyUnsafe) -> Self::Output; +} + +impl RpcExtensionBuilder for F where + F: Fn(sc_rpc::DenyUnsafe) -> R, + R: sc_rpc::RpcExtension, +{ + type Output = R; + + fn build(&self, deny: sc_rpc::DenyUnsafe) -> Self::Output { + (*self)(deny) + } +} + +/// A utility struct for implementing an `RpcExtensionBuilder` given a cloneable +/// `RpcExtension`, the resulting builder will simply ignore the provided +/// `DenyUnsafe` instance and return a static `RpcExtension` instance. +struct NoopRpcExtensionBuilder(R); + +impl RpcExtensionBuilder for NoopRpcExtensionBuilder where + R: Clone + sc_rpc::RpcExtension, +{ + type Output = R; + + fn build(&self, _deny: sc_rpc::DenyUnsafe) -> Self::Output { + self.0.clone() + } +} + +impl From for NoopRpcExtensionBuilder where + R: sc_rpc::RpcExtension, +{ + fn from(e: R) -> NoopRpcExtensionBuilder { + NoopRpcExtensionBuilder(e) + } +} + + /// Full client type. pub type TFullClient = Client< TFullBackend, @@ -311,7 +360,7 @@ impl ServiceBuilder<(), (), (), (), (), (), (), (), (), (), ()> { finality_proof_request_builder: None, finality_proof_provider: None, transaction_pool: Arc::new(()), - rpc_extensions: Default::default(), + rpc_extensions_builder: Box::new(|_| ()), remote_backend: None, block_announce_validator_builder: None, marker: PhantomData, @@ -394,7 +443,7 @@ impl ServiceBuilder<(), (), (), (), (), (), (), (), (), (), ()> { finality_proof_request_builder: None, finality_proof_provider: None, transaction_pool: Arc::new(()), - rpc_extensions: Default::default(), + rpc_extensions_builder: Box::new(|_| ()), remote_backend: Some(remote_blockchain), block_announce_validator_builder: None, marker: PhantomData, @@ -467,7 +516,7 @@ impl finality_proof_request_builder: self.finality_proof_request_builder, finality_proof_provider: self.finality_proof_provider, transaction_pool: self.transaction_pool, - rpc_extensions: self.rpc_extensions, + rpc_extensions_builder: self.rpc_extensions_builder, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, marker: self.marker, @@ -512,7 +561,7 @@ impl finality_proof_request_builder: self.finality_proof_request_builder, finality_proof_provider: self.finality_proof_provider, transaction_pool: self.transaction_pool, - rpc_extensions: self.rpc_extensions, + rpc_extensions_builder: self.rpc_extensions_builder, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, marker: self.marker, @@ -550,7 +599,7 @@ impl finality_proof_request_builder: self.finality_proof_request_builder, finality_proof_provider, transaction_pool: self.transaction_pool, - rpc_extensions: self.rpc_extensions, + rpc_extensions_builder: self.rpc_extensions_builder, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, marker: self.marker, @@ -616,7 +665,7 @@ impl finality_proof_request_builder: fprb, finality_proof_provider: self.finality_proof_provider, transaction_pool: self.transaction_pool, - rpc_extensions: self.rpc_extensions, + rpc_extensions_builder: self.rpc_extensions_builder, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, marker: self.marker, @@ -680,21 +729,30 @@ impl finality_proof_request_builder: self.finality_proof_request_builder, finality_proof_provider: self.finality_proof_provider, transaction_pool: Arc::new(transaction_pool), - rpc_extensions: self.rpc_extensions, + rpc_extensions_builder: self.rpc_extensions_builder, remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, marker: self.marker, }) } - /// Defines the RPC extensions to use. - pub fn with_rpc_extensions( + /// Defines the RPC extension builder to use. Unlike `with_rpc_extensions`, + /// this method is useful in situations where the RPC extensions need to + /// access to a `DenyUnsafe` instance to avoid exposing sensitive methods. + pub fn with_rpc_extensions_builder( self, - rpc_ext_builder: impl FnOnce(&Self) -> Result, - ) -> Result, Error> - where TSc: Clone, TFchr: Clone { - let rpc_extensions = rpc_ext_builder(&self)?; + rpc_extensions_builder: impl FnOnce(&Self) -> Result, + ) -> Result< + ServiceBuilder, + Error, + > + where + TSc: Clone, + TFchr: Clone, + URpcBuilder: RpcExtensionBuilder + Send + 'static, + URpc: sc_rpc::RpcExtension, + { + let rpc_extensions_builder = rpc_extensions_builder(&self)?; Ok(ServiceBuilder { config: self.config, @@ -708,13 +766,30 @@ impl finality_proof_request_builder: self.finality_proof_request_builder, finality_proof_provider: self.finality_proof_provider, transaction_pool: self.transaction_pool, - rpc_extensions, + rpc_extensions_builder: Box::new(rpc_extensions_builder), remote_backend: self.remote_backend, block_announce_validator_builder: self.block_announce_validator_builder, marker: self.marker, }) } + /// Defines the RPC extensions to use. + pub fn with_rpc_extensions( + self, + rpc_extensions: impl FnOnce(&Self) -> Result, + ) -> Result< + ServiceBuilder, + Error, + > + where + TSc: Clone, + TFchr: Clone, + URpc: Clone + sc_rpc::RpcExtension + Send + 'static, + { + let rpc_extensions = rpc_extensions(&self)?; + self.with_rpc_extensions_builder(|_| Ok(NoopRpcExtensionBuilder::from(rpc_extensions))) + } + /// Defines the `BlockAnnounceValidator` to use. `DefaultBlockAnnounceValidator` will be used by /// default. pub fn with_block_announce_validator( @@ -736,7 +811,7 @@ impl finality_proof_request_builder: self.finality_proof_request_builder, finality_proof_provider: self.finality_proof_provider, transaction_pool: self.transaction_pool, - rpc_extensions: self.rpc_extensions, + rpc_extensions_builder: self.rpc_extensions_builder, remote_backend: self.remote_backend, block_announce_validator_builder: Some(Box::new(block_announce_validator_builder)), marker: self.marker, @@ -816,7 +891,7 @@ ServiceBuilder< TSc: Clone, TImpQu: 'static + ImportQueue, TExPool: MaintainedTransactionPool::Hash> + MallocSizeOfWasm + 'static, - TRpc: sc_rpc::RpcExtension + Clone, + TRpc: sc_rpc::RpcExtension, { /// Set an ExecutionExtensionsFactory @@ -854,7 +929,7 @@ ServiceBuilder< finality_proof_request_builder, finality_proof_provider, transaction_pool, - rpc_extensions, + rpc_extensions_builder, remote_backend, block_announce_validator_builder, } = self; @@ -1160,7 +1235,7 @@ ServiceBuilder< maybe_offchain_rpc, author::AuthorApi::to_delegate(author), system::SystemApi::to_delegate(system), - rpc_extensions.clone(), + rpc_extensions_builder.build(deny_unsafe), )) }; let rpc = start_rpc_servers(&config, gen_handler)?; diff --git a/client/service/src/lib.rs b/client/service/src/lib.rs index c902e6bb90..4f2be23f87 100644 --- a/client/service/src/lib.rs +++ b/client/service/src/lib.rs @@ -64,7 +64,7 @@ pub use self::error::Error; pub use self::builder::{ new_full_client, new_client, ServiceBuilder, ServiceBuilderCommand, TFullClient, TLightClient, TFullBackend, TLightBackend, - TFullCallExecutor, TLightCallExecutor, + TFullCallExecutor, TLightCallExecutor, RpcExtensionBuilder, }; pub use config::{Configuration, DatabaseConfig, PruningMode, Role, RpcMethods, TaskType}; pub use sc_chain_spec::{ -- GitLab From 903693105a39f4a88ed99d99a4462616ed059968 Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Thu, 21 May 2020 14:00:24 +0200 Subject: [PATCH 097/150] Offences Weight for OnInitialize (#5961) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Weight accounting for on_offence. * Try to compute weight. * Guesstimate upper bounds on db read/writes for slashing * greater than or equal to * add new trait * Update mock.rs * Add basic weight test * one more test * Update frame/staking/src/lib.rs Co-authored-by: thiolliere * Update frame/staking/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Add test for offences queue Co-authored-by: Tomasz Drwięga Co-authored-by: thiolliere Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> --- bin/node/runtime/src/lib.rs | 5 +++ frame/grandpa/src/mock.rs | 5 +++ frame/offences/benchmarking/src/mock.rs | 16 ++++++- frame/offences/src/lib.rs | 55 +++++++++++++++++-------- frame/offences/src/mock.rs | 26 ++++++++---- frame/offences/src/tests.rs | 47 ++++++++++++++++++++- frame/staking/src/lib.rs | 50 ++++++++++++++++++---- frame/staking/src/tests.rs | 43 +++++++++++++++++++ primitives/staking/src/offence.rs | 10 +++-- 9 files changed, 219 insertions(+), 38 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 2f8e393aa4..e484e84d43 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -584,10 +584,15 @@ impl pallet_im_online::Trait for Runtime { type UnsignedPriority = ImOnlineUnsignedPriority; } +parameter_types! { + pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); +} + impl pallet_offences::Trait for Runtime { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; + type WeightSoftLimit = OffencesWeightSoftLimit; } impl pallet_authority_discovery::Trait for Runtime {} diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index 2b9b25eee6..e429212cef 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -231,10 +231,15 @@ impl staking::Trait for Test { type MaxIterations = (); } +parameter_types! { + pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); +} + impl offences::Trait for Test { type Event = TestEvent; type IdentificationTuple = session::historical::IdentificationTuple; type OnOffenceHandler = Staking; + type WeightSoftLimit = OffencesWeightSoftLimit; } impl Trait for Test { diff --git a/frame/offences/benchmarking/src/mock.rs b/frame/offences/benchmarking/src/mock.rs index fa6e247abd..15b46fc194 100644 --- a/frame/offences/benchmarking/src/mock.rs +++ b/frame/offences/benchmarking/src/mock.rs @@ -20,7 +20,10 @@ #![cfg(test)] use super::*; -use frame_support::parameter_types; +use frame_support::{ + parameter_types, + weights::{Weight, constants::WEIGHT_PER_SECOND}, +}; use frame_system as system; use sp_runtime::{ SaturatedConversion, @@ -34,6 +37,10 @@ type AccountIndex = u32; type BlockNumber = u64; type Balance = u64; +parameter_types! { + pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; +} + impl frame_system::Trait for Test { type Origin = Origin; type Index = AccountIndex; @@ -46,7 +53,7 @@ impl frame_system::Trait for Test { type Header = sp_runtime::testing::Header; type Event = Event; type BlockHashCount = (); - type MaximumBlockWeight = (); + type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = (); type AvailableBlockRatio = (); type MaximumBlockLength = (); @@ -179,10 +186,15 @@ impl pallet_im_online::Trait for Test { type UnsignedPriority = (); } +parameter_types! { + pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); +} + impl pallet_offences::Trait for Test { type Event = Event; type IdentificationTuple = pallet_session::historical::IdentificationTuple; type OnOffenceHandler = Staking; + type WeightSoftLimit = OffencesWeightSoftLimit; } impl frame_system::offchain::SendTransactionTypes for Test where Call: From { diff --git a/frame/offences/src/lib.rs b/frame/offences/src/lib.rs index dd1b052811..a42f09697e 100644 --- a/frame/offences/src/lib.rs +++ b/frame/offences/src/lib.rs @@ -28,9 +28,10 @@ mod tests; use sp_std::vec::Vec; use frame_support::{ decl_module, decl_event, decl_storage, Parameter, debug, + traits::Get, weights::Weight, }; -use sp_runtime::{traits::Hash, Perbill}; +use sp_runtime::{traits::{Hash, Zero}, Perbill}; use sp_staking::{ SessionIndex, offence::{Offence, ReportOffence, Kind, OnOffenceHandler, OffenceDetails, OffenceError}, @@ -58,7 +59,11 @@ pub trait Trait: frame_system::Trait { /// Full identification of the validator. type IdentificationTuple: Parameter + Ord; /// A handler called for every offence report. - type OnOffenceHandler: OnOffenceHandler; + type OnOffenceHandler: OnOffenceHandler; + /// The a soft limit on maximum weight that may be consumed while dispatching deferred offences in + /// `on_initialize`. + /// Note it's going to be exceeded before we stop adding to it, so it has to be set conservatively. + type WeightSoftLimit: Get; } decl_storage! { @@ -102,23 +107,39 @@ decl_module! { fn on_initialize(now: T::BlockNumber) -> Weight { // only decode storage if we can actually submit anything again. - if T::OnOffenceHandler::can_report() { - >::mutate(|deferred| { - // keep those that fail to be reported again. An error log is emitted here; this - // should not happen if staking's `can_report` is implemented properly. - deferred.retain(|(o, p, s)| { - T::OnOffenceHandler::on_offence(&o, &p, *s).map_err(|_| { - debug::native::error!( - target: "pallet-offences", - "re-submitting a deferred slash returned Err at {}. This should not happen with pallet-staking", - now, - ); - }).is_err() - }) - }) + if !T::OnOffenceHandler::can_report() { + return 0; } - 0 + let limit = T::WeightSoftLimit::get(); + let mut consumed = Weight::zero(); + + >::mutate(|deferred| { + deferred.retain(|(offences, perbill, session)| { + if consumed >= limit { + true + } else { + // keep those that fail to be reported again. An error log is emitted here; this + // should not happen if staking's `can_report` is implemented properly. + match T::OnOffenceHandler::on_offence(&offences, &perbill, *session) { + Ok(weight) => { + consumed += weight; + false + }, + Err(_) => { + debug::native::error!( + target: "pallet-offences", + "re-submitting a deferred slash returned Err at {}. This should not happen with pallet-staking", + now, + ); + true + }, + } + } + }) + }); + + consumed } } } diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index 0f5036edc5..b3f35e0171 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -32,7 +32,7 @@ use sp_runtime::traits::{IdentityLookup, BlakeTwo256}; use sp_core::H256; use frame_support::{ impl_outer_origin, impl_outer_event, parameter_types, StorageMap, StorageDoubleMap, - weights::Weight, + weights::{Weight, constants::{WEIGHT_PER_SECOND, RocksDbWeight}}, }; use frame_system as system; @@ -45,20 +45,23 @@ pub struct OnOffenceHandler; thread_local! { pub static ON_OFFENCE_PERBILL: RefCell> = RefCell::new(Default::default()); pub static CAN_REPORT: RefCell = RefCell::new(true); + pub static OFFENCE_WEIGHT: RefCell = RefCell::new(Default::default()); } -impl offence::OnOffenceHandler for OnOffenceHandler { +impl + offence::OnOffenceHandler for OnOffenceHandler +{ fn on_offence( _offenders: &[OffenceDetails], slash_fraction: &[Perbill], _offence_session: SessionIndex, - ) -> Result<(), ()> { - if >::can_report() { + ) -> Result { + if >::can_report() { ON_OFFENCE_PERBILL.with(|f| { *f.borrow_mut() = slash_fraction.to_vec(); }); - Ok(()) + Ok(OFFENCE_WEIGHT.with(|w| *w.borrow())) } else { Err(()) } @@ -79,12 +82,16 @@ pub fn with_on_offence_fractions) -> R>(f: F) -> }) } +pub fn set_offence_weight(new: Weight) { + OFFENCE_WEIGHT.with(|w| *w.borrow_mut() = new); +} + // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Debug)] pub struct Runtime; parameter_types! { pub const BlockHashCount: u64 = 250; - pub const MaximumBlockWeight: Weight = 1024; + pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const MaximumBlockLength: u32 = 2 * 1024; pub const AvailableBlockRatio: Perbill = Perbill::one(); } @@ -101,7 +108,7 @@ impl frame_system::Trait for Runtime { type Event = TestEvent; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; - type DbWeight = (); + type DbWeight = RocksDbWeight; type BlockExecutionWeight = (); type ExtrinsicBaseWeight = (); type MaximumExtrinsicWeight = MaximumBlockWeight; @@ -114,10 +121,15 @@ impl frame_system::Trait for Runtime { type OnKilledAccount = (); } +parameter_types! { + pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); +} + impl Trait for Runtime { type Event = TestEvent; type IdentificationTuple = u64; type OnOffenceHandler = OnOffenceHandler; + type WeightSoftLimit = OffencesWeightSoftLimit; } mod offences { diff --git a/frame/offences/src/tests.rs b/frame/offences/src/tests.rs index b05fee1790..0fb6620b7d 100644 --- a/frame/offences/src/tests.rs +++ b/frame/offences/src/tests.rs @@ -22,7 +22,7 @@ use super::*; use crate::mock::{ Offences, System, Offence, TestEvent, KIND, new_test_ext, with_on_offence_fractions, - offence_reports, set_can_report, + offence_reports, set_can_report, set_offence_weight, }; use sp_runtime::Perbill; use frame_support::traits::OnInitialize; @@ -265,3 +265,48 @@ fn should_queue_and_resubmit_rejected_offence() { assert_eq!(Offences::deferred_offences().len(), 0); }) } + +#[test] +fn weight_soft_limit_is_used() { + new_test_ext().execute_with(|| { + set_can_report(false); + // Only 2 can fit in one block + set_offence_weight(::WeightSoftLimit::get() / 2); + + // Queue 3 offences + // #1 + let offence = Offence { + validator_set_count: 5, + time_slot: 42, + offenders: vec![5], + }; + Offences::report_offence(vec![], offence).unwrap(); + // #2 + let offence = Offence { + validator_set_count: 5, + time_slot: 62, + offenders: vec![5], + }; + Offences::report_offence(vec![], offence).unwrap(); + // #3 + let offence = Offence { + validator_set_count: 5, + time_slot: 72, + offenders: vec![5], + }; + Offences::report_offence(vec![], offence).unwrap(); + // 3 are queued + assert_eq!(Offences::deferred_offences().len(), 3); + + // Allow reporting + set_can_report(true); + + Offences::on_initialize(3); + // Two are completed, one is left in the queue + assert_eq!(Offences::deferred_offences().len(), 1); + + Offences::on_initialize(4); + // All are done now + assert_eq!(Offences::deferred_offences().len(), 0); + }) +} diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 54e7b5aaaf..bb9664bb2e 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -3218,7 +3218,9 @@ impl Convert> } /// This is intended to be used with `FilterHistoricalOffences`. -impl OnOffenceHandler> for Module where +impl + OnOffenceHandler, Weight> +for Module where T: pallet_session::Trait::AccountId>, T: pallet_session::historical::Trait< FullIdentification = Exposure<::AccountId, BalanceOf>, @@ -3226,24 +3228,32 @@ impl OnOffenceHandler, T::SessionHandler: pallet_session::SessionHandler<::AccountId>, T::SessionManager: pallet_session::SessionManager<::AccountId>, - T::ValidatorIdOf: Convert<::AccountId, Option<::AccountId>> + T::ValidatorIdOf: Convert< + ::AccountId, + Option<::AccountId>, + >, { fn on_offence( offenders: &[OffenceDetails>], slash_fraction: &[Perbill], slash_session: SessionIndex, - ) -> Result<(), ()> { + ) -> Result { if !Self::can_report() { return Err(()) } let reward_proportion = SlashRewardFraction::get(); + let mut consumed_weight: Weight = 0; + let mut add_db_reads_writes = |reads, writes| { + consumed_weight += T::DbWeight::get().reads_writes(reads, writes); + }; let active_era = { let active_era = Self::active_era(); + add_db_reads_writes(1, 0); if active_era.is_none() { // this offence need not be re-submitted. - return Ok(()) + return Ok(consumed_weight) } active_era.expect("value checked not to be `None`; qed").index }; @@ -3252,6 +3262,7 @@ impl OnOffenceHandler OnOffenceHandler return Ok(()), // before bonding period. defensive - should be filtered out. Some(&(ref slash_era, _)) => *slash_era, + // before bonding period. defensive - should be filtered out. + None => return Ok(consumed_weight), } }; @@ -3274,14 +3287,18 @@ impl OnOffenceHandler OnOffenceHandler(unapplied); + { + let slash_cost = (6, 5); + let reward_cost = (2, 2); + add_db_reads_writes( + (1 + nominators_len) * slash_cost.0 + reward_cost.0 * reporters_len, + (1 + nominators_len) * slash_cost.1 + reward_cost.1 * reporters_len + ); + } } else { // defer to end of some `slash_defer_duration` from now. ::UnappliedSlashes::mutate( active_era, move |for_later| for_later.push(unapplied), ); + add_db_reads_writes(1, 1); } + } else { + add_db_reads_writes(4 /* fetch_spans */, 5 /* kick_out_if_recent */) } } - Ok(()) + Ok(consumed_weight) } fn can_report() -> bool { diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 80ffc4b7bf..31137e04eb 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -4667,6 +4667,49 @@ fn migrate_era_should_handle_errors_2() { }); } +#[test] +fn offences_weight_calculated_correctly() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + // On offence with zero offenders: 4 Reads, 1 Write + let zero_offence_weight = ::DbWeight::get().reads_writes(4, 1); + assert_eq!(Staking::on_offence(&[], &[Perbill::from_percent(50)], 0), Ok(zero_offence_weight)); + + // On Offence with N offenders, Unapplied: 4 Reads, 1 Write + 4 Reads, 5 Writes + let n_offence_unapplied_weight = ::DbWeight::get().reads_writes(4, 1) + + ::DbWeight::get().reads_writes(4, 5); + + let offenders: Vec::AccountId, pallet_session::historical::IdentificationTuple>> + = (1..10).map(|i| + OffenceDetails { + offender: (i, Staking::eras_stakers(Staking::active_era().unwrap().index, i)), + reporters: vec![], + } + ).collect(); + assert_eq!(Staking::on_offence(&offenders, &[Perbill::from_percent(50)], 0), Ok(n_offence_unapplied_weight)); + + // On Offence with one offenders, Applied + let one_offender = [ + OffenceDetails { + offender: (11, Staking::eras_stakers(Staking::active_era().unwrap().index, 11)), + reporters: vec![1], + }, + ]; + + let n = 1; // Number of offenders + let rw = 3 + 3 * n; // rw reads and writes + let one_offence_unapplied_weight = ::DbWeight::get().reads_writes(4, 1) + + ::DbWeight::get().reads_writes(rw, rw) + // One `slash_cost` + + ::DbWeight::get().reads_writes(6, 5) + // `slash_cost` * nominators (1) + + ::DbWeight::get().reads_writes(6, 5) + // `reward_cost` * reporters (1) + + ::DbWeight::get().reads_writes(2, 2); + + assert_eq!(Staking::on_offence(&one_offender, &[Perbill::from_percent(50)], 0), Ok(one_offence_unapplied_weight)); + }); +} + #[test] fn on_initialize_weight_is_correct() { ExtBuilder::default().has_stakers(false).build_and_execute(|| { diff --git a/primitives/staking/src/offence.rs b/primitives/staking/src/offence.rs index b250dc6c22..e6536b5709 100644 --- a/primitives/staking/src/offence.rs +++ b/primitives/staking/src/offence.rs @@ -127,7 +127,7 @@ impl> ReportOffence { +pub trait OnOffenceHandler { /// A handler for an offence of a particular kind. /// /// Note that this contains a list of all previous offenders @@ -148,7 +148,7 @@ pub trait OnOffenceHandler { offenders: &[OffenceDetails], slash_fraction: &[Perbill], session: SessionIndex, - ) -> Result<(), ()>; + ) -> Result; /// Can an offence be reported now or not. This is an method to short-circuit a call into /// `on_offence`. Ideally, a correct implementation should return `false` if `on_offence` will @@ -157,12 +157,14 @@ pub trait OnOffenceHandler { fn can_report() -> bool; } -impl OnOffenceHandler for () { +impl OnOffenceHandler for () { fn on_offence( _offenders: &[OffenceDetails], _slash_fraction: &[Perbill], _session: SessionIndex, - ) -> Result<(), ()> { Ok(()) } + ) -> Result { + Ok(Default::default()) + } fn can_report() -> bool { true } } -- GitLab From ea0e23e34a037d351013ca7409e966fa0939206f Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Thu, 21 May 2020 16:13:13 +0200 Subject: [PATCH 098/150] Keep `BlockWeight` in Storage (#6046) * keep block weight in storage * Update lib.rs * rename to `BlockWeight`, update tests * remove println * make test better * keep extrinsics length clean --- bin/node/runtime/src/impls.rs | 2 +- frame/executive/src/lib.rs | 41 ++++++++++++++++++------ frame/system/src/lib.rs | 60 +++++++++++++++++------------------ 3 files changed, 62 insertions(+), 41 deletions(-) diff --git a/bin/node/runtime/src/impls.rs b/bin/node/runtime/src/impls.rs index 884bde08df..85c28c9615 100644 --- a/bin/node/runtime/src/impls.rs +++ b/bin/node/runtime/src/impls.rs @@ -62,7 +62,7 @@ pub struct TargetedFeeAdjustment(sp_std::marker::PhantomData); impl> Convert for TargetedFeeAdjustment { fn convert(multiplier: Fixed128) -> Fixed128 { let max_weight = MaximumBlockWeight::get(); - let block_weight = System::all_extrinsics_weight().total().min(max_weight); + let block_weight = System::block_weight().total().min(max_weight); let target_weight = (T::get() * max_weight) as u128; let block_weight = block_weight as u128; diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index f7ac060a6c..04e095fec4 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -708,7 +708,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("409fb5a14aeb8b8c59258b503396a56dee45a0ee28a78de3e622db957425e275").into(), + state_root: hex!("05a38fa4a48ca80ffa8482304be7749a484dc8c9c31462a570d0fbadde6a3633").into(), extrinsics_root: hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), digest: Digest { logs: vec![], }, }, @@ -789,7 +789,7 @@ mod tests { Digest::default(), )); // Base block execution weight + `on_initialize` weight from the custom module. - assert_eq!(>::all_extrinsics_weight().total(), base_block_weight); + assert_eq!(>::block_weight().total(), base_block_weight); for nonce in 0..=num_to_exhaust_block { let xt = TestXt::new( @@ -799,7 +799,7 @@ mod tests { if nonce != num_to_exhaust_block { assert!(res.is_ok()); assert_eq!( - >::all_extrinsics_weight().total(), + >::block_weight().total(), //--------------------- on_initialize + block_execution + extrinsic_base weight (encoded_len + 5) * (nonce + 1) + base_block_weight, ); @@ -819,7 +819,18 @@ mod tests { let len = xt.clone().encode().len() as u32; let mut t = new_test_ext(1); t.execute_with(|| { - assert_eq!(>::all_extrinsics_weight().total(), 0); + // Block execution weight + on_initialize weight from custom module + let base_block_weight = 175 + ::BlockExecutionWeight::get(); + + Executive::initialize_block(&Header::new( + 1, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + + assert_eq!(>::block_weight().total(), base_block_weight); assert_eq!(>::all_extrinsics_len(), 0); assert!(Executive::apply_extrinsic(xt.clone()).unwrap().is_ok()); @@ -827,16 +838,28 @@ mod tests { assert!(Executive::apply_extrinsic(x2.clone()).unwrap().is_ok()); // default weight for `TestXt` == encoded length. + let extrinsic_weight = len as Weight + ::ExtrinsicBaseWeight::get(); assert_eq!( - >::all_extrinsics_weight().total(), - 3 * (len as Weight + ::ExtrinsicBaseWeight::get()), + >::block_weight().total(), + base_block_weight + 3 * extrinsic_weight, ); assert_eq!(>::all_extrinsics_len(), 3 * len); let _ = >::finalize(); - - assert_eq!(>::all_extrinsics_weight().total(), 0); + // All extrinsics length cleaned on `System::finalize` assert_eq!(>::all_extrinsics_len(), 0); + + // New Block + Executive::initialize_block(&Header::new( + 2, + H256::default(), + H256::default(), + [69u8; 32].into(), + Digest::default(), + )); + + // Block weight cleaned up on `System::initialize` + assert_eq!(>::block_weight().total(), base_block_weight); }); } @@ -908,7 +931,7 @@ mod tests { // NOTE: might need updates over time if new weights are introduced. // For now it only accounts for the base block execution weight and // the `on_initialize` weight defined in the custom test module. - assert_eq!(>::all_extrinsics_weight().total(), 175 + 10); + assert_eq!(>::block_weight().total(), 175 + 10); }) } diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 746e6536ea..4fa826ce89 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -429,8 +429,8 @@ decl_storage! { /// Total extrinsics count for the current block. ExtrinsicCount: Option; - /// Total weight for all extrinsics for the current block. - AllExtrinsicsWeight: ExtrinsicsWeight; + /// The current weight for the block. + BlockWeight get(fn block_weight): ExtrinsicsWeight; /// Total length (in bytes) for all extrinsics put together, for the current block. AllExtrinsicsLen: Option; @@ -978,11 +978,6 @@ impl Module { ExtrinsicCount::get().unwrap_or_default() } - /// Gets the weight of all executed extrinsics. - pub fn all_extrinsics_weight() -> ExtrinsicsWeight { - AllExtrinsicsWeight::get() - } - pub fn all_extrinsics_len() -> u32 { AllExtrinsicsLen::get().unwrap_or_default() } @@ -1003,7 +998,7 @@ impl Module { /// /// Another potential use-case could be for the `on_initialize` and `on_finalize` hooks. pub fn register_extra_weight_unchecked(weight: Weight, class: DispatchClass) { - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.add(weight, class); }); } @@ -1025,6 +1020,10 @@ impl Module { >::insert(*number - One::one(), parent_hash); >::put(txs_root); + // Remove previous block data from storage + BlockWeight::kill(); + + // Kill inspectable storage entries in state when `InitKind::Full`. if let InitKind::Full = kind { >::kill(); EventCount::kill(); @@ -1036,7 +1035,6 @@ impl Module { pub fn finalize() -> T::Header { ExecutionPhase::kill(); ExtrinsicCount::kill(); - AllExtrinsicsWeight::kill(); AllExtrinsicsLen::kill(); let number = >::take(); @@ -1126,7 +1124,7 @@ impl Module { /// Set the current block weight. This should only be used in some integration tests. #[cfg(any(feature = "std", test))] pub fn set_block_limits(weight: Weight, len: usize) { - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.put(weight, DispatchClass::Normal) }); AllExtrinsicsLen::put(len as u32); @@ -1383,7 +1381,7 @@ impl CheckWeight where info: &DispatchInfoOf, ) -> Result { let maximum_weight = T::MaximumBlockWeight::get(); - let mut all_weight = Module::::all_extrinsics_weight(); + let mut all_weight = Module::::block_weight(); match info.class { // If we have a dispatch that must be included in the block, it ignores all the limits. DispatchClass::Mandatory => { @@ -1474,7 +1472,7 @@ impl CheckWeight where Self::check_extrinsic_weight(info)?; AllExtrinsicsLen::put(next_len); - AllExtrinsicsWeight::put(next_weight); + BlockWeight::put(next_weight); Ok(()) } @@ -1565,7 +1563,7 @@ impl SignedExtension for CheckWeight where let unspent = post_info.calc_unspent(info); if unspent > 0 { - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.sub(unspent, info.class); }) } @@ -2288,7 +2286,7 @@ pub(crate) mod tests { let len = 0_usize; let reset_check_weight = |i, f, s| { - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.put(s, DispatchClass::Normal) }); let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, i, len); @@ -2310,19 +2308,19 @@ pub(crate) mod tests { let len = 0_usize; // We allow 75% for normal transaction, so we put 25% - extrinsic base weight - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.put(256 - ::ExtrinsicBaseWeight::get(), DispatchClass::Normal) }); let pre = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &info, len).unwrap(); - assert_eq!(AllExtrinsicsWeight::get().total(), info.weight + 256); + assert_eq!(BlockWeight::get().total(), info.weight + 256); assert!( CheckWeight::::post_dispatch(pre, &info, &post_info, len, &Ok(())) .is_ok() ); assert_eq!( - AllExtrinsicsWeight::get().total(), + BlockWeight::get().total(), post_info.actual_weight.unwrap() + 256, ); }) @@ -2335,13 +2333,13 @@ pub(crate) mod tests { let post_info = PostDispatchInfo { actual_weight: Some(700), }; let len = 0_usize; - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.put(128, DispatchClass::Normal) }); let pre = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &info, len).unwrap(); assert_eq!( - AllExtrinsicsWeight::get().total(), + BlockWeight::get().total(), info.weight + 128 + ::ExtrinsicBaseWeight::get(), ); @@ -2350,7 +2348,7 @@ pub(crate) mod tests { .is_ok() ); assert_eq!( - AllExtrinsicsWeight::get().total(), + BlockWeight::get().total(), info.weight + 128 + ::ExtrinsicBaseWeight::get(), ); }) @@ -2363,11 +2361,11 @@ pub(crate) mod tests { let len = 0_usize; // Initial weight from `BlockExecutionWeight` - assert_eq!(System::all_extrinsics_weight().total(), ::BlockExecutionWeight::get()); + assert_eq!(System::block_weight().total(), ::BlockExecutionWeight::get()); let r = CheckWeight::(PhantomData).pre_dispatch(&1, CALL, &free, len); assert!(r.is_ok()); assert_eq!( - System::all_extrinsics_weight().total(), + System::block_weight().total(), ::ExtrinsicBaseWeight::get() + ::BlockExecutionWeight::get() ); }) @@ -2390,8 +2388,8 @@ pub(crate) mod tests { check(|max, len| { assert_ok!(CheckWeight::::do_pre_dispatch(max, len)); - assert_eq!(System::all_extrinsics_weight().total(), Weight::max_value()); - assert!(System::all_extrinsics_weight().total() > ::MaximumBlockWeight::get()); + assert_eq!(System::block_weight().total(), Weight::max_value()); + assert!(System::block_weight().total() > ::MaximumBlockWeight::get()); }); check(|max, len| { assert_ok!(CheckWeight::::do_validate(max, len)); @@ -2419,8 +2417,8 @@ pub(crate) mod tests { fn register_extra_weight_unchecked_doesnt_care_about_limits() { new_test_ext().execute_with(|| { System::register_extra_weight_unchecked(Weight::max_value(), DispatchClass::Normal); - assert_eq!(System::all_extrinsics_weight().total(), Weight::max_value()); - assert!(System::all_extrinsics_weight().total() > ::MaximumBlockWeight::get()); + assert_eq!(System::block_weight().total(), Weight::max_value()); + assert!(System::block_weight().total() > ::MaximumBlockWeight::get()); }); } @@ -2438,10 +2436,10 @@ pub(crate) mod tests { let len = 0_usize; assert_ok!(CheckWeight::::do_pre_dispatch(&max_normal, len)); - assert_eq!(System::all_extrinsics_weight().total(), 768); + assert_eq!(System::block_weight().total(), 768); assert_ok!(CheckWeight::::do_pre_dispatch(&rest_operational, len)); assert_eq!(::MaximumBlockWeight::get(), 1024); - assert_eq!(System::all_extrinsics_weight().total(), ::MaximumBlockWeight::get()); + assert_eq!(System::block_weight().total(), ::MaximumBlockWeight::get()); }); } @@ -2456,10 +2454,10 @@ pub(crate) mod tests { assert_ok!(CheckWeight::::do_pre_dispatch(&rest_operational, len)); // Extra 15 here from block execution + base extrinsic weight - assert_eq!(System::all_extrinsics_weight().total(), 266); + assert_eq!(System::block_weight().total(), 266); assert_ok!(CheckWeight::::do_pre_dispatch(&max_normal, len)); assert_eq!(::MaximumBlockWeight::get(), 1024); - assert_eq!(System::all_extrinsics_weight().total(), ::MaximumBlockWeight::get()); + assert_eq!(System::block_weight().total(), ::MaximumBlockWeight::get()); }); } @@ -2489,7 +2487,7 @@ pub(crate) mod tests { let normal_limit = normal_weight_limit(); // given almost full block - AllExtrinsicsWeight::mutate(|current_weight| { + BlockWeight::mutate(|current_weight| { current_weight.put(normal_limit, DispatchClass::Normal) }); // will not fit. -- GitLab From af950847f3d9da1924b147bc83f33afb3dcfc47d Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Thu, 21 May 2020 16:23:51 +0200 Subject: [PATCH 099/150] clarify docs on query_info and partial_fee (#6090) --- .../rpc/runtime-api/src/lib.rs | 6 ++-- frame/transaction-payment/src/lib.rs | 30 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/frame/transaction-payment/rpc/runtime-api/src/lib.rs b/frame/transaction-payment/rpc/runtime-api/src/lib.rs index 4392807338..17a8bcdf44 100644 --- a/frame/transaction-payment/rpc/runtime-api/src/lib.rs +++ b/frame/transaction-payment/rpc/runtime-api/src/lib.rs @@ -26,7 +26,7 @@ use codec::{Encode, Codec, Decode}; use serde::{Serialize, Deserialize, Serializer, Deserializer}; use sp_runtime::traits::{MaybeDisplay, MaybeFromStr}; -/// Some information related to a dispatchable that can be queried from the runtime. +/// Information related to a dispatchable's class, weight, and fee that can be queried from the runtime. #[derive(Eq, PartialEq, Encode, Decode, Default)] #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] @@ -35,8 +35,8 @@ pub struct RuntimeDispatchInfo { pub weight: Weight, /// Class of this dispatch. pub class: DispatchClass, - /// The partial inclusion fee of this dispatch. This does not include tip or anything else which - /// is dependent on the signature (aka. depends on a `SignedExtension`). + /// The inclusion fee of this dispatch. This does not include a tip or anything else that + /// depends on the signature (i.e. depends on a `SignedExtension`). #[cfg_attr(feature = "std", serde(bound(serialize = "Balance: std::fmt::Display")))] #[cfg_attr(feature = "std", serde(serialize_with = "serialize_as_string"))] #[cfg_attr(feature = "std", serde(bound(deserialize = "Balance: std::str::FromStr")))] diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 71ef8a56c2..11b86170e7 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -107,8 +107,9 @@ decl_module! { impl Module { /// Query the data that we know about the fee of a given `call`. /// - /// As this module is not and cannot be aware of the internals of a signed extension, it only - /// interprets them as some encoded value and takes their length into account. + /// This module is not and cannot be aware of the internals of a signed extension, for example + /// a tip. It only interprets the extrinsic as some encoded value and accounts for its weight + /// and length, the runtime's extrinsic base weight, and the current fee multiplier. /// /// All dispatchables must be annotated with weight and will have some fee info. This function /// always returns. @@ -137,17 +138,24 @@ impl Module { /// Compute the final fee value for a particular transaction. /// /// The final fee is composed of: - /// - _base_fee_: This is the minimum amount a user pays for a transaction. - /// - _len_fee_: This is the amount paid merely to pay for size of the transaction. - /// - _weight_fee_: This amount is computed based on the weight of the transaction. Unlike - /// size-fee, this is not input dependent and reflects the _complexity_ of the execution - /// and the time it consumes. - /// - _targeted_fee_adjustment_: This is a multiplier that can tune the final fee based on + /// - `base_fee`: This is the minimum amount a user pays for a transaction. It is declared + /// as a base _weight_ in the runtime and converted to a fee using `WeightToFee`. + /// - `len_fee`: The length fee, the amount paid for the encoded length (in bytes) of the + /// transaction. + /// - `weight_fee`: This amount is computed based on the weight of the transaction. Weight + /// accounts for the execution time of a transaction. + /// - `targeted_fee_adjustment`: This is a multiplier that can tune the final fee based on /// the congestion of the network. - /// - (optional) _tip_: if included in the transaction, it will be added on top. Only signed - /// transactions can have a tip. + /// - (Optional) `tip`: If included in the transaction, the tip will be added on top. Only + /// signed transactions can have a tip. /// - /// final_fee = base_fee + targeted_fee_adjustment(len_fee + weight_fee) + tip; + /// The base fee and adjusted weight and length fees constitute the _inclusion fee,_ which is + /// the minimum fee for a transaction to be included in a block. + /// + /// ```ignore + /// inclusion_fee = base_fee + targeted_fee_adjustment * (len_fee + weight_fee); + /// final_fee = inclusion_fee + tip; + /// ``` pub fn compute_fee( len: u32, info: &DispatchInfoOf, -- GitLab From 15698fcd02f7167d8ad7162db997e2ce39513643 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 21 May 2020 16:26:29 +0200 Subject: [PATCH 100/150] .maintain/monitoring: Add an initial set of Prometheus alerting rules (#6095) Create a place to collaborate on Prometheus alerting rules for Substrate starting with a basic set of rules covering: - Resource usage - Block production - Block finalization - Transaction queue - Networking - ... Others --- .../alerting-rules/alerting-rules.yaml | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 .maintain/monitoring/alerting-rules/alerting-rules.yaml diff --git a/.maintain/monitoring/alerting-rules/alerting-rules.yaml b/.maintain/monitoring/alerting-rules/alerting-rules.yaml new file mode 100644 index 0000000000..cb5b3c271d --- /dev/null +++ b/.maintain/monitoring/alerting-rules/alerting-rules.yaml @@ -0,0 +1,113 @@ +groups: +- name: polkadot.rules + rules: + + ############################################################################## + # Resource usage + ############################################################################## + + - alert: HighCPUUsage + expr: polkadot_cpu_usage_percentage >= 100 + for: 5m + labels: + severity: warning + annotations: + message: 'The node {{ $labels.instance }} has a CPU usage higher than 100% for more than 5 minutes' + + ############################################################################## + # Block production + ############################################################################## + + - alert: LowNumberOfNewBlocks + annotations: + message: 'Less than one new block per minute on instance {{ $labels.instance }}.' + expr: increase(polkadot_block_height{status="best"}[1m]) < 1 + for: 3m + labels: + severity: warning + - alert: LowNumberOfNewBlocks + annotations: + message: 'Less than one new block per minute on instance {{ $labels.instance }}.' + expr: increase(polkadot_block_height{status="best"}[1m]) < 1 + for: 10m + labels: + severity: critical + + ############################################################################## + # Block finalization + ############################################################################## + + - alert: BlockFinalizationSlow + expr: increase(polkadot_block_height{status="finalized"}[1m]) < 1 + for: 3m + labels: + severity: warning + annotations: + message: 'Finalized block on instance {{ $labels.instance }} increases by less than 1 per minute.' + - alert: BlockFinalizationSlow + expr: increase(polkadot_block_height{status="finalized"}[1m]) < 1 + for: 10m + labels: + severity: critical + annotations: + message: 'Finalized block on instance {{ $labels.instance }} increases by less than 1 per minute.' + - alert: BlockFinalizationLaggingBehind + # Under the assumption of an average block production of 6 seconds, + # "best" and "finalized" being more than 10 blocks apart would imply + # more than a 1 minute delay between block production and finalization. + expr: (polkadot_block_height_number{status="best"} - ignoring(status) polkadot_block_height_number{status="finalized"}) > 10 + for: 8m + labels: + severity: critical + annotations: + message: "Block finalization on instance {{ $labels.instance }} is behind block production by {{ $value }} for more than 8m" + + ############################################################################## + # Transaction queue + ############################################################################## + + - alert: TransactionQueueSize + expr: polkadot_sub_txpool_validations_scheduled - polkadot_sub_txpool_validations_finished > 10 + for: 10m + labels: + severity: warning + annotations: + message: 'The node {{ $labels.instance }} has more than 10 transactions in the queue for more than 10 minutes' + - alert: TransactionQueueSize + expr: polkadot_sub_txpool_validations_scheduled - polkadot_sub_txpool_validations_finished > 10 + for: 30m + labels: + severity: critical + annotations: + message: 'The node {{ $labels.instance }} has more than 10 transactions in the queue for more than 30 minutes' + + ############################################################################## + # Networking + ############################################################################## + + - alert: LowNumberOfPeers + expr: polkadot_sub_libp2p_peers_count < 3 + for: 3m + labels: + severity: warning + annotations: + message: 'The node {{ $labels.instance }} has less than 3 peers for more than 3 minutes' + - alert: LowNumberOfPeers + expr: polkadot_sub_libp2p_peers_count < 3 + for: 15m + labels: + severity: critical + annotations: + message: 'The node {{ $labels.instance }} has less than 3 peers for more than 15 minutes' + + ############################################################################## + # Others + ############################################################################## + + - alert: AuthorityDiscoveryHighDiscoveryFailure + expr: polkadot_authority_discovery_handle_value_found_event_failure / ignoring(name) polkadot_authority_discovery_dht_event_received{name="value_found"} > 0.5 + for: 2h + labels: + severity: warning + annotations: + message: "Authority discovery on node {{ $labels.instance }} fails to process more than 50 % of the values found on the DHT." -- GitLab From 1ba1e8065bf90391f72ef85fa5b20d02aedff6c9 Mon Sep 17 00:00:00 2001 From: satellitex Date: Fri, 22 May 2020 02:32:23 +0900 Subject: [PATCH 101/150] Add Keccak hasher (#6101) * fix keccak hasher * Update hasher.rs Co-authored-by: Gavin Wood --- primitives/core/src/hasher.rs | 20 ++++++++++++++++++++ primitives/core/src/lib.rs | 2 ++ primitives/io/src/lib.rs | 10 ++++++++++ primitives/runtime/src/traits.rs | 27 +++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/primitives/core/src/hasher.rs b/primitives/core/src/hasher.rs index 96a79bf5f6..8ccaa4d90a 100644 --- a/primitives/core/src/hasher.rs +++ b/primitives/core/src/hasher.rs @@ -36,3 +36,23 @@ pub mod blake2 { } } } + +pub mod keccak { + use hash_db::Hasher; + use hash256_std_hasher::Hash256StdHasher; + use crate::hash::H256; + + /// Concrete implementation of Hasher using Keccak 256-bit hashes + #[derive(Debug)] + pub struct KeccakHasher; + + impl Hasher for KeccakHasher { + type Out = H256; + type StdHasher = Hash256StdHasher; + const LENGTH: usize = 32; + + fn hash(x: &[u8]) -> Self::Out { + crate::hashing::keccak_256(x).into() + } + } +} diff --git a/primitives/core/src/lib.rs b/primitives/core/src/lib.rs index 91bdf6683d..56dbbc7b78 100644 --- a/primitives/core/src/lib.rs +++ b/primitives/core/src/lib.rs @@ -83,6 +83,8 @@ pub use crypto::{DeriveJunction, Pair, Public}; pub use hash_db::Hasher; #[cfg(feature = "std")] pub use self::hasher::blake2::Blake2Hasher; +#[cfg(feature = "std")] +pub use self::hasher::keccak::KeccakHasher; pub use sp_storage as storage; diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index 687e01060f..f28f3e2c95 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -300,6 +300,16 @@ pub trait Trie { fn blake2_256_ordered_root(input: Vec>) -> H256 { Layout::::ordered_trie_root(input) } + + /// A trie root formed from the iterated items. + fn keccak_256_root(input: Vec<(Vec, Vec)>) -> H256 { + Layout::::trie_root(input) + } + + /// A trie root formed from the enumerated items. + fn keccak_256_ordered_root(input: Vec>) -> H256 { + Layout::::ordered_trie_root(input) + } } /// Interface that provides miscellaneous functions for communicating between the runtime and the node. diff --git a/primitives/runtime/src/traits.rs b/primitives/runtime/src/traits.rs index 7e7b5558b5..7d7e969427 100644 --- a/primitives/runtime/src/traits.rs +++ b/primitives/runtime/src/traits.rs @@ -376,6 +376,33 @@ impl Hash for BlakeTwo256 { } } +/// Keccak-256 Hash implementation. +#[derive(PartialEq, Eq, Clone, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct Keccak256; + +impl Hasher for Keccak256 { + type Out = sp_core::H256; + type StdHasher = hash256_std_hasher::Hash256StdHasher; + const LENGTH: usize = 32; + + fn hash(s: &[u8]) -> Self::Out { + sp_io::hashing::keccak_256(s).into() + } +} + +impl Hash for Keccak256 { + type Output = sp_core::H256; + + fn trie_root(input: Vec<(Vec, Vec)>) -> Self::Output { + sp_io::trie::keccak_256_root(input) + } + + fn ordered_trie_root(input: Vec>) -> Self::Output { + sp_io::trie::keccak_256_ordered_root(input) + } +} + /// Something that can be checked for equality and printed out to a debug channel if bad. pub trait CheckEqual { /// Perform the equality check. -- GitLab From 0b274c98b2c43c505aca8a144c0138ae0266156d Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Thu, 21 May 2020 19:32:44 +0200 Subject: [PATCH 102/150] Implement FixedPoint trait. (#5877) * Implement Fixed trait. * Fix tests * Fix tests * Fix tests 2 * Address review comment regarding from_i129. * Remove precision by using log10() as suggested in review. * Add small comments. * Use checked versions + panic for ops::*. * Remove repeated test. * Uncomment test. * Remove casts. * Add more comments. * Add tests. * Panic on saturating_div_int * More tests. * More docs. * Saturating renames. * Fix to_bound doc. * Move some impl to trait. * Add range * Add macro pre. * More round() tests. * Delete confusion. * More impl to trait * Add doc for fixedpoint op. * Remove trailing spaces. * Suggested docs changes. * More tests and comments for roundings. * Some quickcheck tests. * Add missing panic, more test/comments. * Nits. * Rename. * Remove primitives-types import. * Apply review suggestions * Fix long lines and add some fuzz. * fix long line * Update fuzzer * Bump impl * fix warnings Co-authored-by: Gavin Wood Co-authored-by: Shawn Tabrizi --- Cargo.lock | 4 +- bin/node/executor/tests/basic.rs | 4 +- bin/node/executor/tests/fees.rs | 4 +- bin/node/runtime/src/impls.rs | 40 +- bin/node/runtime/src/lib.rs | 2 +- frame/balances/src/tests.rs | 4 +- frame/transaction-payment/src/lib.rs | 19 +- primitives/arithmetic/Cargo.toml | 3 +- primitives/arithmetic/fuzzer/Cargo.lock | 401 ------ primitives/arithmetic/fuzzer/Cargo.toml | 6 +- primitives/arithmetic/fuzzer/src/fixed.rs | 82 ++ primitives/arithmetic/src/fixed.rs | 1534 +++++++++++++++++++++ primitives/arithmetic/src/fixed128.rs | 732 ---------- primitives/arithmetic/src/fixed64.rs | 382 ----- primitives/arithmetic/src/lib.rs | 6 +- primitives/arithmetic/src/traits.rs | 4 +- primitives/runtime/src/lib.rs | 2 +- 17 files changed, 1661 insertions(+), 1568 deletions(-) delete mode 100644 primitives/arithmetic/fuzzer/Cargo.lock create mode 100644 primitives/arithmetic/fuzzer/src/fixed.rs create mode 100644 primitives/arithmetic/src/fixed.rs delete mode 100644 primitives/arithmetic/src/fixed128.rs delete mode 100644 primitives/arithmetic/src/fixed64.rs diff --git a/Cargo.lock b/Cargo.lock index 6674b8d3ab..ef0584f4ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2057,9 +2057,9 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.47" +version = "0.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3de2c3273ef7735df1c5a72128ca85b1d20105b9aac643cdfd7a6e581311150" +checksum = "832bac18a82ec7d6c21887daa8616b238fe90d5d5e762d0d4b9372cdaa9e097f" dependencies = [ "arbitrary", "lazy_static", diff --git a/bin/node/executor/tests/basic.rs b/bin/node/executor/tests/basic.rs index 857f438e1c..7799f0913a 100644 --- a/bin/node/executor/tests/basic.rs +++ b/bin/node/executor/tests/basic.rs @@ -26,7 +26,7 @@ use frame_support::{ }; use sp_core::{NeverNativeValue, traits::Externalities, storage::well_known_keys}; use sp_runtime::{ - ApplyExtrinsicResult, Fixed128, + ApplyExtrinsicResult, Fixed128, FixedPointNumber, traits::Hash as HashT, transaction_validity::InvalidTransaction, }; @@ -61,7 +61,7 @@ fn transfer_fee(extrinsic: &E, fee_multiplier: Fixed128) -> Balance { let weight = default_transfer_call().get_dispatch_info().weight; let weight_fee = ::WeightToFee::calc(&weight); - base_fee + fee_multiplier.saturated_multiply_accumulate(length_fee + weight_fee) + base_fee + fee_multiplier.saturating_mul_acc_int(length_fee + weight_fee) } fn xt() -> UncheckedExtrinsic { diff --git a/bin/node/executor/tests/fees.rs b/bin/node/executor/tests/fees.rs index c4c3ca0bfc..a4fc3930da 100644 --- a/bin/node/executor/tests/fees.rs +++ b/bin/node/executor/tests/fees.rs @@ -22,7 +22,7 @@ use frame_support::{ weights::{GetDispatchInfo, constants::ExtrinsicBaseWeight, IdentityFee, WeightToFeePolynomial}, }; use sp_core::NeverNativeValue; -use sp_runtime::{Fixed128, Perbill}; +use sp_runtime::{FixedPointNumber, Fixed128, Perbill}; use node_runtime::{ CheckedExtrinsic, Call, Runtime, Balances, TransactionPayment, TransactionByteFee, @@ -39,7 +39,7 @@ fn fee_multiplier_increases_and_decreases_on_big_weight() { let mut t = new_test_ext(COMPACT_CODE, false); // initial fee multiplier must be zero - let mut prev_multiplier = Fixed128::from_parts(0); + let mut prev_multiplier = Fixed128::from_inner(0); t.execute_with(|| { assert_eq!(TransactionPayment::next_fee_multiplier(), prev_multiplier); diff --git a/bin/node/runtime/src/impls.rs b/bin/node/runtime/src/impls.rs index 85c28c9615..0047ae5c1b 100644 --- a/bin/node/runtime/src/impls.rs +++ b/bin/node/runtime/src/impls.rs @@ -17,13 +17,10 @@ //! Some configurable implementations as associated type for the substrate runtime. -use core::num::NonZeroI128; use node_primitives::Balance; use sp_runtime::traits::{Convert, Saturating}; -use sp_runtime::{Fixed128, Perquintill}; -use frame_support::{ - traits::{OnUnbalanced, Currency, Get}, -}; +use sp_runtime::{FixedPointNumber, Fixed128, Perquintill}; +use frame_support::traits::{OnUnbalanced, Currency, Get}; use crate::{Balances, System, Authorship, MaximumBlockWeight, NegativeImbalance}; pub struct Author; @@ -69,18 +66,14 @@ impl> Convert for TargetedFeeAdjustment< // determines if the first_term is positive let positive = block_weight >= target_weight; let diff_abs = block_weight.max(target_weight) - block_weight.min(target_weight); - // safe, diff_abs cannot exceed u64 and it can always be computed safely even with the lossy - // `Fixed128::from_rational`. - let diff = Fixed128::from_rational( - diff_abs as i128, - NonZeroI128::new(max_weight.max(1) as i128).unwrap(), - ); + // safe, diff_abs cannot exceed u64. + let diff = Fixed128::saturating_from_rational(diff_abs, max_weight.max(1)); let diff_squared = diff.saturating_mul(diff); // 0.00004 = 4/100_000 = 40_000/10^9 - let v = Fixed128::from_rational(4, NonZeroI128::new(100_000).unwrap()); + let v = Fixed128::saturating_from_rational(4, 100_000); // 0.00004^2 = 16/10^10 Taking the future /2 into account... 8/10^10 - let v_squared_2 = Fixed128::from_rational(8, NonZeroI128::new(10_000_000_000).unwrap()); + let v_squared_2 = Fixed128::saturating_from_rational(8, 10_000_000_000u64); let first_term = v.saturating_mul(diff); let second_term = v_squared_2.saturating_mul(diff_squared); @@ -99,7 +92,7 @@ impl> Convert for TargetedFeeAdjustment< // multiplier. While at -1, it means that the network is so un-congested that all // transactions have no weight fee. We stop here and only increase if the network // became more busy. - .max(Fixed128::from_natural(-1)) + .max(Fixed128::saturating_from_integer(-1)) } } } @@ -111,7 +104,6 @@ mod tests { use crate::{MaximumBlockWeight, AvailableBlockRatio, Runtime}; use crate::{constants::currency::*, TransactionPayment, TargetBlockFullness}; use frame_support::weights::{Weight, WeightToFeePolynomial}; - use core::num::NonZeroI128; fn max() -> Weight { MaximumBlockWeight::get() @@ -135,7 +127,7 @@ mod tests { let s = block_weight; let fm = v * (s/m - ss/m) + v.powi(2) * (s/m - ss/m).powi(2) / 2.0; - let addition_fm = Fixed128::from_parts((fm * Fixed128::accuracy() as f64).round() as i128); + let addition_fm = Fixed128::from_inner((fm * Fixed128::accuracy() as f64).round() as i128); previous.saturating_add(addition_fm) } @@ -150,7 +142,7 @@ mod tests { #[test] fn fee_multiplier_update_poc_works() { - let fm = Fixed128::from_rational(0, NonZeroI128::new(1).unwrap()); + let fm = Fixed128::saturating_from_rational(0, 1); let test_set = vec![ (0, fm.clone()), (100, fm.clone()), @@ -164,7 +156,7 @@ mod tests { fee_multiplier_update(w, fm), TargetedFeeAdjustment::::convert(fm), // Error is only 1 in 10^18 - Fixed128::from_parts(1), + Fixed128::from_inner(1), ); }) }) @@ -180,7 +172,7 @@ mod tests { loop { let next = TargetedFeeAdjustment::::convert(fm); fm = next; - if fm == Fixed128::from_natural(-1) { break; } + if fm == Fixed128::saturating_from_integer(-1) { break; } iterations += 1; } println!("iteration {}, new fm = {:?}. Weight fee is now zero", iterations, fm); @@ -220,7 +212,7 @@ mod tests { iterations += 1; let fee = ::WeightToFee::calc(&tx_weight); - let adjusted_fee = fm.saturated_multiply_accumulate(fee); + let adjusted_fee = fm.saturating_mul_acc_int(fee); println!( "iteration {}, new fm = {:?}. Fee at this point is: {} units / {} millicents, \ {} cents, {} dollars", @@ -323,8 +315,8 @@ mod tests { // ... stops going down at -1 assert_eq!( - TargetedFeeAdjustment::::convert(Fixed128::from_natural(-1)), - Fixed128::from_natural(-1) + TargetedFeeAdjustment::::convert(Fixed128::saturating_from_integer(-1)), + Fixed128::saturating_from_integer(-1) ); }) } @@ -333,7 +325,7 @@ mod tests { fn weight_to_fee_should_not_overflow_on_large_weights() { let kb = 1024 as Weight; let mb = kb * kb; - let max_fm = Fixed128::from_natural(i128::max_value()); + let max_fm = Fixed128::saturating_from_integer(i128::max_value()); // check that for all values it can compute, correctly. vec![ @@ -356,7 +348,7 @@ mod tests { run_with_system_weight(i, || { let next = TargetedFeeAdjustment::::convert(Fixed128::default()); let truth = fee_multiplier_update(i, Fixed128::default()); - assert_eq_error_rate!(truth, next, Fixed128::from_parts(50_000_000)); + assert_eq_error_rate!(truth, next, Fixed128::from_inner(50_000_000)); }); }); diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index e484e84d43..69c8e98316 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -94,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 250, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/frame/balances/src/tests.rs b/frame/balances/src/tests.rs index 9cfdc147b4..149b9f07d2 100644 --- a/frame/balances/src/tests.rs +++ b/frame/balances/src/tests.rs @@ -37,7 +37,7 @@ macro_rules! decl_tests { ($test:ty, $ext_builder:ty, $existential_deposit:expr) => { use crate::*; - use sp_runtime::{Fixed128, traits::{SignedExtension, BadOrigin}}; + use sp_runtime::{FixedPointNumber, Fixed128, traits::{SignedExtension, BadOrigin}}; use frame_support::{ assert_noop, assert_ok, assert_err, traits::{ @@ -154,7 +154,7 @@ macro_rules! decl_tests { .monied(true) .build() .execute_with(|| { - pallet_transaction_payment::NextFeeMultiplier::put(Fixed128::from_natural(1)); + pallet_transaction_payment::NextFeeMultiplier::put(Fixed128::saturating_from_integer(1)); Balances::set_lock(ID_1, &1, 10, WithdrawReason::Reserve.into()); assert_noop!( >::transfer(&1, &2, 1, AllowDeath), diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 11b86170e7..c52d698756 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -44,7 +44,7 @@ use frame_support::{ dispatch::DispatchResult, }; use sp_runtime::{ - Fixed128, + Fixed128, FixedPointNumber, transaction_validity::{ TransactionPriority, ValidTransaction, InvalidTransaction, TransactionValidityError, TransactionValidity, @@ -83,7 +83,7 @@ pub trait Trait: frame_system::Trait { decl_storage! { trait Store for Module as TransactionPayment { - pub NextFeeMultiplier get(fn next_fee_multiplier): Multiplier = Multiplier::from_parts(0); + pub NextFeeMultiplier get(fn next_fee_multiplier): Multiplier = Multiplier::from_inner(0); } } @@ -172,7 +172,7 @@ impl Module { // the adjustable part of the fee let adjustable_fee = len_fee.saturating_add(unadjusted_weight_fee); let targeted_fee_adjustment = NextFeeMultiplier::get(); - let adjusted_fee = targeted_fee_adjustment.saturated_multiply_accumulate(adjustable_fee.saturated_into()); + let adjusted_fee = targeted_fee_adjustment.saturating_mul_acc_int(adjustable_fee.saturated_into()); let base_fee = Self::weight_to_fee(T::ExtrinsicBaseWeight::get()); base_fee.saturating_add(adjusted_fee.saturated_into()).saturating_add(tip) @@ -190,7 +190,7 @@ impl Module { { let fee = UniqueSaturatedInto::::unique_saturated_into(Self::weight_to_fee(weight)); UniqueSaturatedFrom::unique_saturated_from( - NextFeeMultiplier::get().saturated_multiply_accumulate(fee) + NextFeeMultiplier::get().saturating_mul_acc_int(fee) ) } @@ -329,7 +329,6 @@ impl SignedExtension for ChargeTransactionPayment whe #[cfg(test)] mod tests { use super::*; - use core::num::NonZeroI128; use codec::Encode; use frame_support::{ impl_outer_dispatch, impl_outer_origin, parameter_types, @@ -575,7 +574,7 @@ mod tests { .execute_with(|| { let len = 10; - NextFeeMultiplier::put(Fixed128::from_rational(1, NonZeroI128::new(2).unwrap())); + NextFeeMultiplier::put(Fixed128::saturating_from_rational(1, 2)); let pre = ChargeTransactionPayment::::from(5 /* tipped */) .pre_dispatch(&2, CALL, &info_from_weight(100), len) @@ -663,7 +662,7 @@ mod tests { .execute_with(|| { // all fees should be x1.5 - NextFeeMultiplier::put(Fixed128::from_rational(1, NonZeroI128::new(2).unwrap())); + NextFeeMultiplier::put(Fixed128::saturating_from_rational(1, 2)); let len = 10; assert!( @@ -691,7 +690,7 @@ mod tests { .execute_with(|| { // all fees should be x1.5 - NextFeeMultiplier::put(Fixed128::from_rational(1, NonZeroI128::new(2).unwrap())); + NextFeeMultiplier::put(Fixed128::saturating_from_rational(1, 2)); assert_eq!( TransactionPayment::query_info(xt, len), @@ -720,7 +719,7 @@ mod tests { .execute_with(|| { // Next fee multiplier is zero - assert_eq!(NextFeeMultiplier::get(), Fixed128::from_natural(0)); + assert_eq!(NextFeeMultiplier::get(), Fixed128::saturating_from_integer(0)); // Tip only, no fees works let dispatch_info = DispatchInfo { @@ -760,7 +759,7 @@ mod tests { .execute_with(|| { // Add a next fee multiplier - NextFeeMultiplier::put(Fixed128::from_rational(1, NonZeroI128::new(2).unwrap())); // = 1/2 = .5 + NextFeeMultiplier::put(Fixed128::saturating_from_rational(1, 2)); // = 1/2 = .5 // Base fee is unaffected by multiplier let dispatch_info = DispatchInfo { weight: 0, diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index c22706e32e..9d080d6010 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -20,12 +20,12 @@ num-traits = { version = "0.2.8", default-features = false } sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } sp-debug-derive = { version = "2.0.0-dev", default-features = false, path = "../../primitives/debug-derive" } -primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] rand = "0.7.2" criterion = "0.3" serde_json = "1.0" +primitive-types = "0.7.0" [features] default = ["std"] @@ -35,7 +35,6 @@ std = [ "sp-std/std", "serde", "sp-debug-derive/std", - "primitive-types/std", ] [[bench]] diff --git a/primitives/arithmetic/fuzzer/Cargo.lock b/primitives/arithmetic/fuzzer/Cargo.lock deleted file mode 100644 index 3a4187437a..0000000000 --- a/primitives/arithmetic/fuzzer/Cargo.lock +++ /dev/null @@ -1,401 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -[[package]] -name = "arbitrary" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cf76cb6e2222ed0ea86b2b0ee2f71c96ec6edd5af42e84d59160e91b836ec4" - -[[package]] -name = "arrayvec" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" - -[[package]] -name = "autocfg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" - -[[package]] -name = "bitvec" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993f74b4c99c1908d156b8d2e0fb6277736b0ecbd833982fd1241d39b2766a6" - -[[package]] -name = "byte-slice-cast" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" - -[[package]] -name = "byteorder" -version = "1.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" - -[[package]] -name = "c2-chacha" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" -dependencies = [ - "ppv-lite86", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "fixed-hash" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3367952ceb191f4ab95dd5685dc163ac539e36202f9fcfd0cb22f9f9c542fefc" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "getrandom" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "honggfuzz" -version = "0.5.45" -dependencies = [ - "arbitrary", - "lazy_static", - "memmap", -] - -[[package]] -name = "impl-codec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "integer-sqrt" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65877bf7d44897a473350b1046277941cee20b263397e90869c50b6e766088b" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" - -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" -dependencies = [ - "autocfg", -] - -[[package]] -name = "parity-scale-codec" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f509c5e67ca0605ee17dcd3f91ef41cadd685c75a298fb6261b781a5acb3f910" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0ec292e92e8ec7c58e576adacc1e3f399c597c8f263c42f18420abe58e7245" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" - -[[package]] -name = "primitive-types" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4336f4f5d5524fa60bcbd6fe626f9223d8142a50e7053e979acdf0da41ab975" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro2" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "quote" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom", - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -dependencies = [ - "c2-chacha", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "serde" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sp-arithmetic" -version = "2.0.0-alpha.3" -dependencies = [ - "integer-sqrt", - "num-traits", - "parity-scale-codec", - "serde", - "sp-debug-derive", - "sp-std", -] - -[[package]] -name = "sp-arithmetic-fuzzer" -version = "2.0.0" -dependencies = [ - "honggfuzz", - "num-bigint", - "num-traits", - "primitive-types", - "sp-arithmetic", -] - -[[package]] -name = "sp-debug-derive" -version = "2.0.0-alpha.3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "sp-std" -version = "2.0.0-alpha.3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "syn" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "toml" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -dependencies = [ - "serde", -] - -[[package]] -name = "uint" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" -dependencies = [ - "byteorder", - "crunchy", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "unicode-xid" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "winapi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index fdcf691762..c4842adc84 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-arithmetic = { version = "2.0.0-dev", path = ".." } -honggfuzz = "0.5" +honggfuzz = "0.5.49" primitive-types = "0.7.0" num-bigint = "0.2" num-traits = "0.2" @@ -31,3 +31,7 @@ path = "src/per_thing_rational.rs" [[bin]] name = "rational128" path = "src/rational128.rs" + +[[bin]] +name = "fixed" +path = "src/fixed.rs" \ No newline at end of file diff --git a/primitives/arithmetic/fuzzer/src/fixed.rs b/primitives/arithmetic/fuzzer/src/fixed.rs new file mode 100644 index 0000000000..115d7dbbdb --- /dev/null +++ b/primitives/arithmetic/fuzzer/src/fixed.rs @@ -0,0 +1,82 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Running +//! Running this fuzzer can be done with `cargo hfuzz run fixed`. `honggfuzz` CLI options can +//! be used by setting `HFUZZ_RUN_ARGS`, such as `-n 4` to use 4 threads. +//! +//! # Debugging a panic +//! Once a panic is found, it can be debugged with +//! `cargo hfuzz run-debug fixed hfuzz_workspace/fixed/*.fuzz`. +//! +//! # More information +//! More information about `honggfuzz` can be found +//! [here](https://docs.rs/honggfuzz/). + +use honggfuzz::fuzz; +use sp_arithmetic::{FixedPointNumber, Fixed64, traits::Saturating}; + +fn main() { + loop { + fuzz!(|data: (i32, i32)| { + let x: i128 = data.0.into(); + let y: i128 = data.1.into(); + + // Check `from_rational` and division are consistent. + if y != 0 { + let f1 = Fixed64::saturating_from_integer(x) / Fixed64::saturating_from_integer(y); + let f2 = Fixed64::saturating_from_rational(x, y); + assert_eq!(f1.into_inner(), f2.into_inner()); + } + + // Check `saturating_mul`. + let a = Fixed64::saturating_from_rational(2, 5); + let b = a.saturating_mul(Fixed64::saturating_from_integer(x)); + let n = b.into_inner() as i128; + let m = 2i128 * x * Fixed64::accuracy() as i128 / 5i128; + assert_eq!(n, m); + + // Check `saturating_mul` and division are inverse. + if x != 0 { + assert_eq!(a, b / Fixed64::saturating_from_integer(x)); + } + + // Check `reciprocal`. + let r = a.reciprocal().unwrap().reciprocal().unwrap(); + assert_eq!(a, r); + + // Check addition. + let a = Fixed64::saturating_from_integer(x); + let b = Fixed64::saturating_from_integer(y); + let c = Fixed64::saturating_from_integer(x.saturating_add(y)); + assert_eq!(a.saturating_add(b), c); + + // Check substraction. + let a = Fixed64::saturating_from_integer(x); + let b = Fixed64::saturating_from_integer(y); + let c = Fixed64::saturating_from_integer(x.saturating_sub(y)); + assert_eq!(a.saturating_sub(b), c); + + // Check `saturating_mul_acc_int`. + let a = Fixed64::saturating_from_rational(2, 5); + let b = a.saturating_mul_acc_int(x); + let xx = Fixed64::saturating_from_integer(x); + let d = a.saturating_mul(xx).saturating_add(xx).into_inner() as i128 / Fixed64::accuracy() as i128; + assert_eq!(b, d); + }); + } +} diff --git a/primitives/arithmetic/src/fixed.rs b/primitives/arithmetic/src/fixed.rs new file mode 100644 index 0000000000..19f498593d --- /dev/null +++ b/primitives/arithmetic/src/fixed.rs @@ -0,0 +1,1534 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! Decimal Fixed Point implementations for Substrate runtime. + +use sp_std::{ops::{self, Add, Sub, Mul, Div}, fmt::Debug, prelude::*, convert::{TryInto, TryFrom}}; +use codec::{Encode, Decode}; +use crate::{ + helpers_128bit::multiply_by_rational, PerThing, + traits::{ + SaturatedConversion, CheckedSub, CheckedAdd, CheckedMul, CheckedDiv, CheckedNeg, + Bounded, Saturating, UniqueSaturatedInto, Zero, One, Signed + }, +}; + +#[cfg(feature = "std")] +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; + +/// Integer types that can be used to interact with `FixedPointNumber` implementations. +pub trait FixedPointOperand: Copy + Clone + Bounded + Zero + Saturating + + PartialOrd + UniqueSaturatedInto + TryFrom + CheckedNeg {} + +impl FixedPointOperand for i128 {} +impl FixedPointOperand for u128 {} +impl FixedPointOperand for i64 {} +impl FixedPointOperand for u64 {} +impl FixedPointOperand for i32 {} +impl FixedPointOperand for u32 {} +impl FixedPointOperand for i16 {} +impl FixedPointOperand for u16 {} +impl FixedPointOperand for i8 {} +impl FixedPointOperand for u8 {} + +/// Something that implements a decimal fixed point number. +/// +/// The precision is given by `Self::DIV`, i.e. `1 / DIV` can be represented. +/// +/// Each type can store numbers from `Self::Inner::min_value() / Self::DIV` +/// to `Self::Inner::max_value() / Self::DIV`. +/// This is also referred to as the _accuracy_ of the type in the documentation. +pub trait FixedPointNumber: + Sized + Copy + Default + Debug + + Saturating + Bounded + + Eq + PartialEq + Ord + PartialOrd + + CheckedSub + CheckedAdd + CheckedMul + CheckedDiv + + Add + Sub + Div + Mul +{ + /// The underlying data type used for this fixed point number. + type Inner: Debug + One + CheckedMul + CheckedDiv + CheckedNeg + Signed + FixedPointOperand; + + /// Precision of this fixed point implementation. It should be a power of `10`. + const DIV: Self::Inner; + + /// Precision of this fixed point implementation. + fn accuracy() -> Self::Inner { + Self::DIV + } + + /// Builds this type from an integer number. + fn from_inner(int: Self::Inner) -> Self; + + /// Consumes `self` and returns the inner raw value. + fn into_inner(self) -> Self::Inner; + + /// Creates self from an integer number `int`. + /// + /// Returns `Self::max` or `Self::min` if `int` exceeds accuracy. + fn saturating_from_integer>(int: N) -> Self { + Self::from_inner(int.unique_saturated_into().saturating_mul(Self::DIV)) + } + + /// Creates `self` from an integer number `int`. + /// + /// Returns `None` if `int` exceeds accuracy. + fn checked_from_integer(int: Self::Inner) -> Option { + int.checked_mul(&Self::DIV).map(|inner| Self::from_inner(inner)) + } + + /// Creates `self` from a rational number. Equal to `n / d`. + /// + /// Panics if `d = 0`. Returns `Self::max` or `Self::min` if `n / d` exceeds accuracy. + fn saturating_from_rational(n: N, d: D) -> Self { + if d == D::zero() { + panic!("attempt to divide by zero") + } + Self::checked_from_rational(n, d).unwrap_or(to_bound(n, d)) + } + + /// Creates `self` from a rational number. Equal to `n / d`. + /// + /// Returns `None` if `d == 0` or `n / d` exceeds accuracy. + fn checked_from_rational(n: N, d: D) -> Option { + if d == D::zero() { + return None + } + + let n: I129 = n.into(); + let d: I129 = d.into(); + let negative = n.negative != d.negative; + + multiply_by_rational(n.value, Self::DIV.unique_saturated_into(), d.value).ok() + .and_then(|value| from_i129(I129 { value, negative })) + .map(|inner| Self::from_inner(inner)) + } + + /// Checked multiplication for integer type `N`. Equal to `self * n`. + /// + /// Returns `None` if the result does not fit in `N`. + fn checked_mul_int(self, n: N) -> Option { + let lhs: I129 = self.into_inner().into(); + let rhs: I129 = n.into(); + let negative = lhs.negative != rhs.negative; + + multiply_by_rational(lhs.value, rhs.value, Self::DIV.unique_saturated_into()).ok() + .and_then(|value| from_i129(I129 { value, negative })) + } + + /// Saturating multiplication for integer type `N`. Equal to `self * n`. + /// + /// Returns `N::min` or `N::max` if the result does not fit in `N`. + fn saturating_mul_int(self, n: N) -> N { + self.checked_mul_int(n).unwrap_or(to_bound(self.into_inner(), n)) + } + + /// Checked division for integer type `N`. Equal to `self / d`. + /// + /// Returns `None` if the result does not fit in `N` or `d == 0`. + fn checked_div_int(self, d: N) -> Option { + let lhs: I129 = self.into_inner().into(); + let rhs: I129 = d.into(); + let negative = lhs.negative != rhs.negative; + + lhs.value.checked_div(rhs.value) + .and_then(|n| n.checked_div(Self::DIV.unique_saturated_into())) + .and_then(|value| from_i129(I129 { value, negative })) + } + + /// Saturating division for integer type `N`. Equal to `self / d`. + /// + /// Panics if `d == 0`. Returns `N::min` or `N::max` if the result does not fit in `N`. + fn saturating_div_int(self, d: N) -> N { + if d == N::zero() { + panic!("attempt to divide by zero") + } + self.checked_div_int(d).unwrap_or(to_bound(self.into_inner(), d)) + } + + /// Saturating multiplication for integer type `N`, adding the result back. + /// Equal to `self * n + n`. + /// + /// Returns `N::min` or `N::max` if the multiplication or final result does not fit in `N`. + fn saturating_mul_acc_int(self, n: N) -> N { + self.saturating_mul_int(n).saturating_add(n) + } + + /// Saturating absolute value. + /// + /// Returns `Self::max` if `self == Self::min`. + fn saturating_abs(self) -> Self { + let inner = self.into_inner(); + if inner.is_positive() { + self + } else { + Self::from_inner(inner.checked_neg().unwrap_or(Self::Inner::max_value())) + } + } + + /// Takes the reciprocal (inverse). Equal to `1 / self`. + /// + /// Returns `None` if `self = 0`. + fn reciprocal(self) -> Option { + Self::one().checked_div(&self) + } + + /// Returns zero. + fn zero() -> Self { + Self::from_inner(Self::Inner::zero()) + } + + /// Checks if the number is zero. + fn is_zero(&self) -> bool { + self.into_inner() == Self::Inner::zero() + } + + /// Returns one. + fn one() -> Self { + Self::from_inner(Self::DIV) + } + + /// Checks if the number is one. + fn is_one(&self) -> bool { + self.into_inner() == Self::Inner::one() + } + + /// Checks if the number is positive. + fn is_positive(self) -> bool { + self.into_inner() >= Self::Inner::zero() + } + + /// Checks if the number is negative. + fn is_negative(self) -> bool { + self.into_inner() < Self::Inner::zero() + } + + /// Returns the integer part. + fn trunc(self) -> Self { + self.into_inner().checked_div(&Self::DIV) + .expect("panics only if DIV is zero, DIV is not zero; qed") + .checked_mul(&Self::DIV) + .map(|inner| Self::from_inner(inner)) + .expect("can not overflow since fixed number is >= integer part") + } + + /// Returns the fractional part. + /// + /// Note: the returned fraction will be non-negative for negative numbers, + /// except in the case where the integer part is zero. + fn frac(self) -> Self { + let integer = self.trunc(); + let fractional = self.saturating_sub(integer); + if integer == Self::zero() { + fractional + } else { + fractional.saturating_abs() + } + } + + /// Returns the smallest integer greater than or equal to a number. + /// + /// Saturates to `Self::max` (truncated) if the result does not fit. + fn ceil(self) -> Self { + if self.is_negative() { + self.trunc() + } else { + self.saturating_add(Self::one()).trunc() + } + } + + /// Returns the largest integer less than or equal to a number. + /// + /// Saturates to `Self::min` (truncated) if the result does not fit. + fn floor(self) -> Self { + if self.is_negative() { + self.saturating_sub(Self::one()).trunc() + } else { + self.trunc() + } + } + + /// Returns the number rounded to the nearest integer. Rounds half-way cases away from 0.0. + /// + /// Saturates to `Self::min` or `Self::max` (truncated) if the result does not fit. + fn round(self) -> Self { + let n = self.frac().saturating_mul(Self::saturating_from_integer(10)); + if n < Self::saturating_from_integer(5) { + self.trunc() + } else { + let extra = Self::saturating_from_integer(self.into_inner().signum()); + (self.saturating_add(extra)).trunc() + } + } +} + +/// Data type used as intermediate storage in some computations to avoid overflow. +struct I129 { + value: u128, + negative: bool, +} + +impl From for I129 { + fn from(n: N) -> I129 { + if n < N::zero() { + let value: u128 = n.checked_neg() + .map(|n| n.unique_saturated_into()) + .unwrap_or(N::max_value().unique_saturated_into().saturating_add(1)); + I129 { value, negative: true } + } else { + I129 { value: n.unique_saturated_into(), negative: false } + } + } +} + +/// Transforms an `I129` to `N` if it is possible. +fn from_i129(n: I129) -> Option { + let max_plus_one: u128 = N::max_value().unique_saturated_into().saturating_add(1); + if n.negative && N::min_value() < N::zero() && n.value == max_plus_one { + Some(N::min_value()) + } else { + let unsigned_inner: N = n.value.try_into().ok()?; + let inner = if n.negative { unsigned_inner.checked_neg()? } else { unsigned_inner }; + Some(inner) + } +} + +/// Returns `R::max` if the sign of `n * m` is positive, `R::min` otherwise. +fn to_bound(n: N, m: D) -> R { + if (n < N::zero()) != (m < D::zero()) { + R::min_value() + } else { + R::max_value() + } +} + +macro_rules! implement_fixed { + ( + $name:ident, + $test_mod:ident, + $inner_type:ty, + $div:tt, + $title:expr $(,)? + ) => { + /// A fixed point number representation in the range. + /// + #[doc = $title] + #[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] + pub struct $name($inner_type); + + impl From<$inner_type> for $name { + fn from(int: $inner_type) -> Self { + $name::saturating_from_integer(int) + } + } + + impl From<(N, D)> for $name { + fn from(r: (N, D)) -> Self { + $name::saturating_from_rational(r.0, r.1) + } + } + + impl FixedPointNumber for $name { + type Inner = $inner_type; + + const DIV: Self::Inner = $div; + + fn from_inner(inner: Self::Inner) -> Self { + Self(inner) + } + + fn into_inner(self) -> Self::Inner { + self.0 + } + } + + impl Saturating for $name { + fn saturating_add(self, rhs: Self) -> Self { + Self(self.0.saturating_add(rhs.0)) + } + + fn saturating_sub(self, rhs: Self) -> Self { + Self(self.0.saturating_sub(rhs.0)) + } + + fn saturating_mul(self, rhs: Self) -> Self { + self.checked_mul(&rhs).unwrap_or(to_bound(self.0, rhs.0)) + } + + fn saturating_pow(self, exp: usize) -> Self { + if exp == 0 { + return Self::saturating_from_integer(1); + } + + let exp = exp as u32; + let msb_pos = 32 - exp.leading_zeros(); + + let mut result = Self::saturating_from_integer(1); + let mut pow_val = self; + for i in 0..msb_pos { + if ((1 << i) & exp) > 0 { + result = result.saturating_mul(pow_val); + } + pow_val = pow_val.saturating_mul(pow_val); + } + result + } + } + + impl ops::Neg for $name { + type Output = Self; + + fn neg(self) -> Self::Output { + Self(-self.0) + } + } + + impl ops::Add for $name { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + Self(self.0 + rhs.0) + } + } + + impl ops::Sub for $name { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + Self(self.0 - rhs.0) + } + } + + impl ops::Mul for $name { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + self.checked_mul(&rhs) + .unwrap_or_else(|| panic!("attempt to multiply with overflow")) + } + } + + impl ops::Div for $name { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + if rhs.0 == 0 { + panic!("attempt to divide by zero") + } + self.checked_div(&rhs) + .unwrap_or_else(|| panic!("attempt to divide with overflow")) + } + } + + impl CheckedSub for $name { + fn checked_sub(&self, rhs: &Self) -> Option { + self.0.checked_sub(rhs.0).map(Self) + } + } + + impl CheckedAdd for $name { + fn checked_add(&self, rhs: &Self) -> Option { + self.0.checked_add(rhs.0).map(Self) + } + } + + impl CheckedDiv for $name { + fn checked_div(&self, other: &Self) -> Option { + if other.0 == 0 { + return None + } + + let lhs: I129 = self.0.into(); + let rhs: I129 = other.0.into(); + let negative = lhs.negative != rhs.negative; + + multiply_by_rational(lhs.value, Self::DIV as u128, rhs.value).ok() + .and_then(|value| from_i129(I129 { value, negative })) + .map(Self) + } + } + + impl CheckedMul for $name { + fn checked_mul(&self, other: &Self) -> Option { + let lhs: I129 = self.0.into(); + let rhs: I129 = other.0.into(); + let negative = lhs.negative != rhs.negative; + + multiply_by_rational(lhs.value, rhs.value, Self::DIV as u128).ok() + .and_then(|value| from_i129(I129 { value, negative })) + .map(Self) + } + } + + impl Bounded for $name { + fn min_value() -> Self { + Self(::Inner::min_value()) + } + + fn max_value() -> Self { + Self(::Inner::max_value()) + } + } + + impl sp_std::fmt::Debug for $name { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + let integral = { + let int = self.0 / Self::accuracy(); + let signum_for_zero = if int == 0 && self.is_negative() { "-" } else { "" }; + format!("{}{}", signum_for_zero, int) + }; + let precision = (Self::accuracy() as f64).log10() as usize; + let fractional = format!("{:0>weight$}", (self.0 % Self::accuracy()).abs(), weight=precision); + write!(f, "{}({}.{})", stringify!($name), integral, fractional) + } + + #[cfg(not(feature = "std"))] + fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + Ok(()) + } + } + + impl From

for $name { + fn from(p: P) -> Self { + let accuracy = P::ACCURACY.saturated_into(); + let value = p.deconstruct().saturated_into(); + $name::saturating_from_rational(value, accuracy) + } + } + + #[cfg(feature = "std")] + impl sp_std::fmt::Display for $name { + fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + write!(f, "{}", self.0) + } + } + + #[cfg(feature = "std")] + impl sp_std::str::FromStr for $name { + type Err = &'static str; + + fn from_str(s: &str) -> Result { + let inner: ::Inner = s.parse() + .map_err(|_| "invalid string input for fixed point number")?; + Ok(Self::from_inner(inner)) + } + } + + // Manual impl `Serialize` as serde_json does not support i128. + // TODO: remove impl if issue https://github.com/serde-rs/json/issues/548 fixed. + #[cfg(feature = "std")] + impl Serialize for $name { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) + } + } + + // Manual impl `Deserialize` as serde_json does not support i128. + // TODO: remove impl if issue https://github.com/serde-rs/json/issues/548 fixed. + #[cfg(feature = "std")] + impl<'de> Deserialize<'de> for $name { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + use sp_std::str::FromStr; + let s = String::deserialize(deserializer)?; + $name::from_str(&s).map_err(|err_str| de::Error::custom(err_str)) + } + } + + #[cfg(test)] + mod $test_mod { + use super::*; + use crate::{Perbill, Percent, Permill, Perquintill}; + + fn max() -> $name { + $name::max_value() + } + + fn min() -> $name { + $name::min_value() + } + + fn precision() -> usize { + ($name::accuracy() as f64).log10() as usize + } + + #[test] + fn macro_preconditions() { + assert!($name::DIV > 0); + } + + #[test] + fn from_i129_works() { + let a = I129 { + value: 1, + negative: true, + }; + + // Can't convert negative number to unsigned. + assert_eq!(from_i129::(a), None); + + let a = I129 { + value: u128::max_value() - 1, + negative: false, + }; + + // Max - 1 value fits. + assert_eq!(from_i129::(a), Some(u128::max_value() - 1)); + + let a = I129 { + value: u128::max_value(), + negative: false, + }; + + // Max value fits. + assert_eq!(from_i129::(a), Some(u128::max_value())); + + let a = I129 { + value: i128::max_value() as u128 + 1, + negative: true, + }; + + // Min value fits. + assert_eq!(from_i129::(a), Some(i128::min_value())); + + let a = I129 { + value: i128::max_value() as u128 + 1, + negative: false, + }; + + // Max + 1 does not fit. + assert_eq!(from_i129::(a), None); + + let a = I129 { + value: i128::max_value() as u128, + negative: false, + }; + + // Max value fits. + assert_eq!(from_i129::(a), Some(i128::max_value())); + } + + #[test] + fn to_bound_works() { + let a = 1i32; + let b = 1i32; + + // Pos + Pos => Max. + assert_eq!(to_bound::<_, _, i32>(a, b), i32::max_value()); + + let a = -1i32; + let b = -1i32; + + // Neg + Neg => Max. + assert_eq!(to_bound::<_, _, i32>(a, b), i32::max_value()); + + let a = 1i32; + let b = -1i32; + + // Pos + Neg => Min. + assert_eq!(to_bound::<_, _, i32>(a, b), i32::min_value()); + + let a = -1i32; + let b = 1i32; + + // Neg + Pos => Min. + assert_eq!(to_bound::<_, _, i32>(a, b), i32::min_value()); + + let a = 1i32; + let b = -1i32; + + // Pos + Neg => Min (unsigned). + assert_eq!(to_bound::<_, _, u32>(a, b), 0); + } + + #[test] + #[should_panic(expected = "attempt to negate with overflow")] + fn op_neg_panics() { + let a = $name::min_value(); + let _ = -a; + } + + #[test] + fn op_neg_works() { + let a = $name::saturating_from_integer(5); + let b = -a; + + // Positive. + assert_eq!($name::saturating_from_integer(-5), b); + + let a = $name::saturating_from_integer(-5); + let b = -a; + + // Negative + assert_eq!($name::saturating_from_integer(5), b); + + let a = $name::max_value(); + let b = -a; + + // Max. + assert_eq!($name::min_value() + $name::from_inner(1), b); + + let a = $name::min_value() + $name::from_inner(1); + let b = -a; + + // Min. + assert_eq!($name::max_value(), b); + + let a = $name::zero(); + let b = -a; + + // Zero. + assert_eq!(a, b); + } + + #[test] + #[should_panic(expected = "attempt to add with overflow")] + fn op_add_panics() { + let a = $name::max_value(); + let b = 1.into(); + let _ = a + b; + } + + #[test] + fn op_add_works() { + let a = $name::saturating_from_rational(5, 2); + let b = $name::saturating_from_rational(1, 2); + + // Positive case: 6/2 = 3. + assert_eq!($name::saturating_from_integer(3), a + b); + + let b = $name::saturating_from_rational(1, -2); + + // Negative case: 4/2 = 2. + assert_eq!($name::saturating_from_integer(2), a + b); + } + + #[test] + #[should_panic(expected = "attempt to subtract with overflow")] + fn op_sub_panics() { + let a = $name::min_value(); + let b = 1.into(); + let _c = a - b; + } + + #[test] + fn op_sub_works() { + let a = $name::saturating_from_rational(5, 2); + let b = $name::saturating_from_rational(1, 2); + + // Negative case: 4/2 = 2. + assert_eq!($name::saturating_from_integer(2), a - b); + + let b = $name::saturating_from_rational(1, -2); + + // Positive case: 6/2 = 3. + assert_eq!($name::saturating_from_integer(3), a - b); + } + + #[test] + #[should_panic(expected = "attempt to multiply with overflow")] + fn op_mul_panics() { + let a = $name::max_value(); + let b = 2.into(); + let _c = a * b; + } + + #[test] + fn op_mul_works() { + let a = $name::saturating_from_integer(42); + let b = $name::saturating_from_integer(2); + assert_eq!($name::saturating_from_integer(84), a * b); + + let a = $name::saturating_from_integer(42); + let b = $name::saturating_from_integer(-2); + assert_eq!($name::saturating_from_integer(-84), a * b); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn op_div_panics_on_zero_divisor() { + let a = $name::saturating_from_integer(1); + let b = 0.into(); + let _c = a / b; + } + + #[test] + #[should_panic(expected = "attempt to divide with overflow")] + fn op_div_panics_on_overflow() { + let a = $name::min_value(); + let b = (-1).into(); + let _c = a / b; + } + + #[test] + fn op_div_works() { + let a = $name::saturating_from_integer(42); + let b = $name::saturating_from_integer(2); + assert_eq!($name::saturating_from_integer(21), a / b); + + let a = $name::saturating_from_integer(42); + let b = $name::saturating_from_integer(-2); + assert_eq!($name::saturating_from_integer(-21), a / b); + } + + #[test] + fn from_integer_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + let accuracy = $name::accuracy(); + + // Cases where integer fits. + let a = $name::saturating_from_integer(42); + assert_eq!(a.into_inner(), 42 * accuracy); + + let a = $name::saturating_from_integer(-42); + assert_eq!(a.into_inner(), -42 * accuracy); + + // Max/min integers that fit. + let a = $name::saturating_from_integer(inner_max / accuracy); + assert_eq!(a.into_inner(), (inner_max / accuracy) * accuracy); + + let a = $name::saturating_from_integer(inner_min / accuracy); + assert_eq!(a.into_inner(), (inner_min / accuracy) * accuracy); + + // Cases where integer doesn't fit, so it saturates. + let a = $name::saturating_from_integer(inner_max / accuracy + 1); + assert_eq!(a.into_inner(), inner_max); + + let a = $name::saturating_from_integer(inner_min / accuracy - 1); + assert_eq!(a.into_inner(), inner_min); + } + + #[test] + fn checked_from_integer_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + let accuracy = $name::accuracy(); + + // Cases where integer fits. + let a = $name::checked_from_integer(42) + .expect("42 * accuracy <= inner_max; qed"); + assert_eq!(a.into_inner(), 42 * accuracy); + + let a = $name::checked_from_integer(-42) + .expect("-42 * accuracy >= inner_min; qed"); + assert_eq!(a.into_inner(), -42 * accuracy); + + // Max/min integers that fit. + let a = $name::checked_from_integer(inner_max / accuracy) + .expect("(inner_max / accuracy) * accuracy <= inner_max; qed"); + assert_eq!(a.into_inner(), (inner_max / accuracy) * accuracy); + + let a = $name::checked_from_integer(inner_min / accuracy) + .expect("(inner_min / accuracy) * accuracy <= inner_min; qed"); + assert_eq!(a.into_inner(), (inner_min / accuracy) * accuracy); + + // Cases where integer doesn't fit, so it returns `None`. + let a = $name::checked_from_integer(inner_max / accuracy + 1); + assert_eq!(a, None); + + let a = $name::checked_from_integer(inner_min / accuracy - 1); + assert_eq!(a, None); + } + + #[test] + fn from_inner_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + + assert_eq!(max(), $name::from_inner(inner_max)); + assert_eq!(min(), $name::from_inner(inner_min)); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn saturating_from_rational_panics_on_zero_divisor() { + let _ = $name::saturating_from_rational(1, 0); + } + + #[test] + fn saturating_from_rational_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + let accuracy = $name::accuracy(); + + let a = $name::saturating_from_rational(5, 2); + + // Positive case: 2.5 + assert_eq!(a.into_inner(), 25 * accuracy / 10); + + let a = $name::saturating_from_rational(-5, 2); + + // Negative case: -2.5 + assert_eq!(a.into_inner(), -25 * accuracy / 10); + + let a = $name::saturating_from_rational(5, -2); + + // Other negative case: -2.5 + assert_eq!(a.into_inner(), -25 * accuracy / 10); + + let a = $name::saturating_from_rational(-5, -2); + + // Other positive case: 2.5 + assert_eq!(a.into_inner(), 25 * accuracy / 10); + + // Max - 1. + let a = $name::saturating_from_rational(inner_max - 1, accuracy); + assert_eq!(a.into_inner(), inner_max - 1); + + // Min + 1. + let a = $name::saturating_from_rational(inner_min + 1, accuracy); + assert_eq!(a.into_inner(), inner_min + 1); + + // Max. + let a = $name::saturating_from_rational(inner_max, accuracy); + assert_eq!(a.into_inner(), inner_max); + + // Min. + let a = $name::saturating_from_rational(inner_min, accuracy); + assert_eq!(a.into_inner(), inner_min); + + // Max + 1, saturates. + let a = $name::saturating_from_rational(inner_max as u128 + 1, accuracy); + assert_eq!(a.into_inner(), inner_max); + + // Min - 1, saturates. + let a = $name::saturating_from_rational(inner_max as u128 + 2, -accuracy); + assert_eq!(a.into_inner(), inner_min); + + // Zero. + let a = $name::saturating_from_rational(0, 1); + assert_eq!(a.into_inner(), 0); + + let a = $name::saturating_from_rational(inner_max, -accuracy); + assert_eq!(a.into_inner(), -inner_max); + + let a = $name::saturating_from_rational(inner_min, -accuracy); + assert_eq!(a.into_inner(), inner_max); + + let a = $name::saturating_from_rational(inner_min + 1, -accuracy); + assert_eq!(a.into_inner(), inner_max); + + let a = $name::saturating_from_rational(inner_max - 1, accuracy); + assert_eq!(a.into_inner(), inner_max - 1); + + let a = $name::saturating_from_rational(inner_min + 1, accuracy); + assert_eq!(a.into_inner(), inner_min + 1); + + let a = $name::saturating_from_rational(inner_max, 1); + assert_eq!(a.into_inner(), inner_max); + + let a = $name::saturating_from_rational(inner_min, 1); + assert_eq!(a.into_inner(), inner_min); + + let a = $name::saturating_from_rational(inner_min, -1); + assert_eq!(a.into_inner(), inner_max); + + let a = $name::saturating_from_rational(inner_max, -1); + assert_eq!(a.into_inner(), inner_min); + + let a = $name::saturating_from_rational(inner_max, inner_max); + assert_eq!(a.into_inner(), accuracy); + + let a = $name::saturating_from_rational(inner_min, inner_min); + assert_eq!(a.into_inner(), accuracy); + + let a = $name::saturating_from_rational(inner_max, -inner_max); + assert_eq!(a.into_inner(), -accuracy); + + let a = $name::saturating_from_rational(-inner_max, inner_max); + assert_eq!(a.into_inner(), -accuracy); + + let a = $name::saturating_from_rational(inner_max, 3 * accuracy); + assert_eq!(a.into_inner(), inner_max / 3); + + let a = $name::saturating_from_rational(inner_max, -3 * accuracy); + assert_eq!(a.into_inner(), -inner_max / 3); + + let a = $name::saturating_from_rational(inner_min, 2 * accuracy); + assert_eq!(a.into_inner(), inner_min / 2); + + let a = $name::saturating_from_rational(inner_min, accuracy / -3); + assert_eq!(a.into_inner(), inner_max); + + let a = $name::saturating_from_rational(inner_min, accuracy / 3); + assert_eq!(a.into_inner(), inner_min); + + let a = $name::saturating_from_rational(1, accuracy); + assert_eq!(a.into_inner(), 1); + + let a = $name::saturating_from_rational(1, -accuracy); + assert_eq!(a.into_inner(), -1); + + // Out of accuracy. + let a = $name::saturating_from_rational(1, accuracy + 1); + assert_eq!(a.into_inner(), 0); + + let a = $name::saturating_from_rational(1, -accuracy - 1); + assert_eq!(a.into_inner(), 0); + } + + #[test] + fn checked_from_rational_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + let accuracy = $name::accuracy(); + + // Divide by zero => None. + let a = $name::checked_from_rational(1, 0); + assert_eq!(a, None); + + // Max - 1. + let a = $name::checked_from_rational(inner_max - 1, accuracy).unwrap(); + assert_eq!(a.into_inner(), inner_max - 1); + + // Min + 1. + let a = $name::checked_from_rational(inner_min + 1, accuracy).unwrap(); + assert_eq!(a.into_inner(), inner_min + 1); + + // Max. + let a = $name::checked_from_rational(inner_max, accuracy).unwrap(); + assert_eq!(a.into_inner(), inner_max); + + // Min. + let a = $name::checked_from_rational(inner_min, accuracy).unwrap(); + assert_eq!(a.into_inner(), inner_min); + + // Max + 1 => Overflow => None. + let a = $name::checked_from_rational(inner_min, -accuracy); + assert_eq!(a, None); + + // Min - 1 => Underflow => None. + let a = $name::checked_from_rational(inner_max as u128 + 2, -accuracy); + assert_eq!(a, None); + + let a = $name::checked_from_rational(inner_max, 3 * accuracy).unwrap(); + assert_eq!(a.into_inner(), inner_max / 3); + + let a = $name::checked_from_rational(inner_max, -3 * accuracy).unwrap(); + assert_eq!(a.into_inner(), -inner_max / 3); + + let a = $name::checked_from_rational(inner_min, 2 * accuracy).unwrap(); + assert_eq!(a.into_inner(), inner_min / 2); + + let a = $name::checked_from_rational(inner_min, accuracy / -3); + assert_eq!(a, None); + + let a = $name::checked_from_rational(inner_min, accuracy / 3); + assert_eq!(a, None); + + let a = $name::checked_from_rational(1, accuracy).unwrap(); + assert_eq!(a.into_inner(), 1); + + let a = $name::checked_from_rational(1, -accuracy).unwrap(); + assert_eq!(a.into_inner(), -1); + + let a = $name::checked_from_rational(1, accuracy + 1).unwrap(); + assert_eq!(a.into_inner(), 0); + + let a = $name::checked_from_rational(1, -accuracy - 1).unwrap(); + assert_eq!(a.into_inner(), 0); + } + + #[test] + fn checked_mul_int_works() { + let a = $name::saturating_from_integer(2); + // Max - 1. + assert_eq!(a.checked_mul_int((i128::max_value() - 1) / 2), Some(i128::max_value() - 1)); + // Max. + assert_eq!(a.checked_mul_int(i128::max_value() / 2), Some(i128::max_value() - 1)); + // Max + 1 => None. + assert_eq!(a.checked_mul_int(i128::max_value() / 2 + 1), None); + + // Min - 1. + assert_eq!(a.checked_mul_int((i128::min_value() + 1) / 2), Some(i128::min_value() + 2)); + // Min. + assert_eq!(a.checked_mul_int(i128::min_value() / 2), Some(i128::min_value())); + // Min + 1 => None. + assert_eq!(a.checked_mul_int(i128::min_value() / 2 - 1), None); + + let a = $name::saturating_from_rational(1, 2); + assert_eq!(a.checked_mul_int(42i128), Some(21)); + assert_eq!(a.checked_mul_int(i128::max_value()), Some(i128::max_value() / 2)); + assert_eq!(a.checked_mul_int(i128::min_value()), Some(i128::min_value() / 2)); + + let b = $name::saturating_from_rational(1, -2); + assert_eq!(b.checked_mul_int(42i128), Some(-21)); + assert_eq!(b.checked_mul_int(u128::max_value()), None); + assert_eq!(b.checked_mul_int(i128::max_value()), Some(i128::max_value() / -2)); + assert_eq!(b.checked_mul_int(i128::min_value()), Some(i128::min_value() / -2)); + + let c = $name::saturating_from_integer(255); + assert_eq!(c.checked_mul_int(2i8), None); + assert_eq!(c.checked_mul_int(2i128), Some(510)); + assert_eq!(c.checked_mul_int(i128::max_value()), None); + assert_eq!(c.checked_mul_int(i128::min_value()), None); + } + + #[test] + fn saturating_mul_int_works() { + let a = $name::saturating_from_integer(2); + // Max - 1. + assert_eq!(a.saturating_mul_int((i128::max_value() - 1) / 2), i128::max_value() - 1); + // Max. + assert_eq!(a.saturating_mul_int(i128::max_value() / 2), i128::max_value() - 1); + // Max + 1 => saturates to max. + assert_eq!(a.saturating_mul_int(i128::max_value() / 2 + 1), i128::max_value()); + + // Min - 1. + assert_eq!(a.saturating_mul_int((i128::min_value() + 1) / 2), i128::min_value() + 2); + // Min. + assert_eq!(a.saturating_mul_int(i128::min_value() / 2), i128::min_value()); + // Min + 1 => saturates to min. + assert_eq!(a.saturating_mul_int(i128::min_value() / 2 - 1), i128::min_value()); + + let a = $name::saturating_from_rational(1, 2); + assert_eq!(a.saturating_mul_int(42i32), 21); + assert_eq!(a.saturating_mul_int(i128::max_value()), i128::max_value() / 2); + assert_eq!(a.saturating_mul_int(i128::min_value()), i128::min_value() / 2); + + let b = $name::saturating_from_rational(1, -2); + assert_eq!(b.saturating_mul_int(42i32), -21); + assert_eq!(b.saturating_mul_int(i128::max_value()), i128::max_value() / -2); + assert_eq!(b.saturating_mul_int(i128::min_value()), i128::min_value() / -2); + assert_eq!(b.saturating_mul_int(u128::max_value()), u128::min_value()); + + let c = $name::saturating_from_integer(255); + assert_eq!(c.saturating_mul_int(2i8), i8::max_value()); + assert_eq!(c.saturating_mul_int(-2i8), i8::min_value()); + assert_eq!(c.saturating_mul_int(i128::max_value()), i128::max_value()); + assert_eq!(c.saturating_mul_int(i128::min_value()), i128::min_value()); + } + + #[test] + fn checked_mul_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + + let a = $name::saturating_from_integer(2); + + // Max - 1. + let b = $name::from_inner(inner_max - 1); + assert_eq!(a.checked_mul(&(b/2.into())), Some(b)); + + // Max. + let c = $name::from_inner(inner_max); + assert_eq!(a.checked_mul(&(c/2.into())), Some(b)); + + // Max + 1 => None. + let e = $name::from_inner(1); + assert_eq!(a.checked_mul(&(c/2.into()+e)), None); + + // Min + 1. + let b = $name::from_inner(inner_min + 1) / 2.into(); + let c = $name::from_inner(inner_min + 2); + assert_eq!(a.checked_mul(&b), Some(c)); + + // Min. + let b = $name::from_inner(inner_min) / 2.into(); + let c = $name::from_inner(inner_min); + assert_eq!(a.checked_mul(&b), Some(c)); + + // Min - 1 => None. + let b = $name::from_inner(inner_min) / 2.into() - $name::from_inner(1); + assert_eq!(a.checked_mul(&b), None); + + let a = $name::saturating_from_rational(1, 2); + let b = $name::saturating_from_rational(1, -2); + let c = $name::saturating_from_integer(255); + + assert_eq!(a.checked_mul(&42.into()), Some(21.into())); + assert_eq!(b.checked_mul(&42.into()), Some((-21).into())); + assert_eq!(c.checked_mul(&2.into()), Some(510.into())); + + assert_eq!(b.checked_mul(&$name::max_value()), $name::max_value().checked_div(&(-2).into())); + assert_eq!(b.checked_mul(&$name::min_value()), $name::min_value().checked_div(&(-2).into())); + + assert_eq!(c.checked_mul(&$name::max_value()), None); + assert_eq!(c.checked_mul(&$name::min_value()), None); + + assert_eq!(a.checked_mul(&$name::max_value()), $name::max_value().checked_div(&2.into())); + assert_eq!(a.checked_mul(&$name::min_value()), $name::min_value().checked_div(&2.into())); + } + + #[test] + fn checked_div_int_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + let accuracy = $name::accuracy(); + + let a = $name::from_inner(inner_max); + let b = $name::from_inner(inner_min); + let c = $name::zero(); + let d = $name::one(); + let e = $name::saturating_from_integer(6); + let f = $name::saturating_from_integer(5); + + assert_eq!(e.checked_div_int(2.into()), Some(3)); + assert_eq!(f.checked_div_int(2.into()), Some(2)); + + assert_eq!(a.checked_div_int(i128::max_value()), Some(0)); + assert_eq!(a.checked_div_int(2), Some(inner_max / (2 * accuracy))); + assert_eq!(a.checked_div_int(inner_max / accuracy), Some(1)); + assert_eq!(a.checked_div_int(1i8), None); + + assert_eq!(a.checked_div_int(-2), Some(-inner_max / (2 * accuracy))); + assert_eq!(a.checked_div_int(inner_max / -accuracy), Some(-1)); + + assert_eq!(b.checked_div_int(i128::min_value()), Some(0)); + assert_eq!(b.checked_div_int(2), Some(inner_min / (2 * accuracy))); + assert_eq!(b.checked_div_int(inner_min / accuracy), Some(1)); + assert_eq!(b.checked_div_int(1i8), None); + + assert_eq!(b.checked_div_int(-2), Some(-(inner_min / (2 * accuracy)))); + assert_eq!(b.checked_div_int(-(inner_min / accuracy)), Some(-1)); + + assert_eq!(c.checked_div_int(1), Some(0)); + assert_eq!(c.checked_div_int(i128::max_value()), Some(0)); + assert_eq!(c.checked_div_int(i128::min_value()), Some(0)); + assert_eq!(c.checked_div_int(1i8), Some(0)); + + assert_eq!(d.checked_div_int(1), Some(1)); + assert_eq!(d.checked_div_int(i32::max_value()), Some(0)); + assert_eq!(d.checked_div_int(i32::min_value()), Some(0)); + assert_eq!(d.checked_div_int(1i8), Some(1)); + + assert_eq!(a.checked_div_int(0), None); + assert_eq!(b.checked_div_int(0), None); + assert_eq!(c.checked_div_int(0), None); + assert_eq!(d.checked_div_int(0), None); + } + + #[test] + #[should_panic(expected = "attempt to divide by zero")] + fn saturating_div_int_panics_when_divisor_is_zero() { + let _ = $name::one().saturating_div_int(0); + } + + #[test] + fn saturating_div_int_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + let accuracy = $name::accuracy(); + + let a = $name::saturating_from_integer(5); + assert_eq!(a.saturating_div_int(2), 2); + + let a = $name::saturating_from_integer(5); + assert_eq!(a.saturating_div_int(-2), -2); + + let a = $name::min_value(); + assert_eq!(a.saturating_div_int(-1i128), (inner_max / accuracy) as i128); + + let a = $name::min_value(); + assert_eq!(a.saturating_div_int(1i128), (inner_min / accuracy) as i128); + } + + #[test] + fn saturating_abs_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + + assert_eq!($name::from_inner(inner_min).saturating_abs(), $name::max_value()); + assert_eq!($name::from_inner(inner_max).saturating_abs(), $name::max_value()); + assert_eq!($name::zero().saturating_abs(), 0.into()); + assert_eq!($name::saturating_from_rational(-1, 2).saturating_abs(), (1, 2).into()); + } + + #[test] + fn saturating_mul_acc_int_works() { + assert_eq!($name::zero().saturating_mul_acc_int(42i8), 42i8); + assert_eq!($name::one().saturating_mul_acc_int(42i8), 2 * 42i8); + + assert_eq!($name::one().saturating_mul_acc_int(i128::max_value()), i128::max_value()); + assert_eq!($name::one().saturating_mul_acc_int(i128::min_value()), i128::min_value()); + + assert_eq!($name::one().saturating_mul_acc_int(u128::max_value() / 2), u128::max_value() - 1); + assert_eq!($name::one().saturating_mul_acc_int(u128::min_value()), u128::min_value()); + + let a = $name::saturating_from_rational(-1, 2); + assert_eq!(a.saturating_mul_acc_int(42i8), 21i8); + assert_eq!(a.saturating_mul_acc_int(u128::max_value() - 1), u128::max_value() - 1); + } + + #[test] + fn saturating_pow_should_work() { + assert_eq!($name::saturating_from_integer(2).saturating_pow(0), $name::saturating_from_integer(1)); + assert_eq!($name::saturating_from_integer(2).saturating_pow(1), $name::saturating_from_integer(2)); + assert_eq!($name::saturating_from_integer(2).saturating_pow(2), $name::saturating_from_integer(4)); + assert_eq!($name::saturating_from_integer(2).saturating_pow(3), $name::saturating_from_integer(8)); + assert_eq!($name::saturating_from_integer(2).saturating_pow(50), + $name::saturating_from_integer(1125899906842624i64)); + + // Saturating. + assert_eq!($name::saturating_from_integer(2).saturating_pow(68), $name::max_value()); + + assert_eq!($name::saturating_from_integer(1).saturating_pow(1000), (1).into()); + assert_eq!($name::saturating_from_integer(-1).saturating_pow(1000), (1).into()); + assert_eq!($name::saturating_from_integer(-1).saturating_pow(1001), (-1).into()); + assert_eq!($name::saturating_from_integer(1).saturating_pow(usize::max_value()), (1).into()); + assert_eq!($name::saturating_from_integer(-1).saturating_pow(usize::max_value()), (-1).into()); + assert_eq!($name::saturating_from_integer(-1).saturating_pow(usize::max_value() - 1), (1).into()); + + assert_eq!($name::saturating_from_integer(114209).saturating_pow(5), $name::max_value()); + + assert_eq!($name::saturating_from_integer(1).saturating_pow(usize::max_value()), (1).into()); + assert_eq!($name::saturating_from_integer(0).saturating_pow(usize::max_value()), (0).into()); + assert_eq!($name::saturating_from_integer(2).saturating_pow(usize::max_value()), $name::max_value()); + } + + #[test] + fn checked_div_works() { + let inner_max = <$name as FixedPointNumber>::Inner::max_value(); + let inner_min = <$name as FixedPointNumber>::Inner::min_value(); + + let a = $name::from_inner(inner_max); + let b = $name::from_inner(inner_min); + let c = $name::zero(); + let d = $name::one(); + let e = $name::saturating_from_integer(6); + let f = $name::saturating_from_integer(5); + + assert_eq!(e.checked_div(&2.into()), Some(3.into())); + assert_eq!(f.checked_div(&2.into()), Some((5, 2).into())); + + assert_eq!(a.checked_div(&inner_max.into()), Some(1.into())); + assert_eq!(a.checked_div(&2.into()), Some($name::from_inner(inner_max / 2))); + assert_eq!(a.checked_div(&$name::max_value()), Some(1.into())); + assert_eq!(a.checked_div(&d), Some(a)); + + assert_eq!(a.checked_div(&(-2).into()), Some($name::from_inner(-inner_max / 2))); + assert_eq!(a.checked_div(&-$name::max_value()), Some((-1).into())); + + assert_eq!(b.checked_div(&b), Some($name::one())); + assert_eq!(b.checked_div(&2.into()), Some($name::from_inner(inner_min / 2))); + + assert_eq!(b.checked_div(&(-2).into()), Some($name::from_inner(inner_min / -2))); + assert_eq!(b.checked_div(&a), Some((-1).into())); + + assert_eq!(c.checked_div(&1.into()), Some(0.into())); + assert_eq!(c.checked_div(&$name::max_value()), Some(0.into())); + assert_eq!(c.checked_div(&$name::min_value()), Some(0.into())); + + assert_eq!(d.checked_div(&1.into()), Some(1.into())); + + assert_eq!(a.checked_div(&$name::one()), Some(a)); + assert_eq!(b.checked_div(&$name::one()), Some(b)); + assert_eq!(c.checked_div(&$name::one()), Some(c)); + assert_eq!(d.checked_div(&$name::one()), Some(d)); + + assert_eq!(a.checked_div(&$name::zero()), None); + assert_eq!(b.checked_div(&$name::zero()), None); + assert_eq!(c.checked_div(&$name::zero()), None); + assert_eq!(d.checked_div(&$name::zero()), None); + } + + #[test] + fn trunc_works() { + let n = $name::saturating_from_rational(5, 2).trunc(); + assert_eq!(n, $name::saturating_from_integer(2)); + + let n = $name::saturating_from_rational(-5, 2).trunc(); + assert_eq!(n, $name::saturating_from_integer(-2)); + } + + #[test] + fn frac_works() { + let n = $name::saturating_from_rational(5, 2); + let i = n.trunc(); + let f = n.frac(); + + assert_eq!(n, i + f); + + let n = $name::saturating_from_rational(-5, 2); + let i = n.trunc(); + let f = n.frac(); + + assert_eq!(n, i - f); + + let n = $name::saturating_from_rational(5, 2) + .frac() + .saturating_mul(10.into()); + assert_eq!(n, 5.into()); + + let n = $name::saturating_from_rational(1, 2) + .frac() + .saturating_mul(10.into()); + assert_eq!(n, 5.into()); + + // The sign is attached to the integer part unless it is zero. + let n = $name::saturating_from_rational(-5, 2) + .frac() + .saturating_mul(10.into()); + assert_eq!(n, 5.into()); + + let n = $name::saturating_from_rational(-1, 2) + .frac() + .saturating_mul(10.into()); + assert_eq!(n, (-5).into()); + } + + #[test] + fn ceil_works() { + let n = $name::saturating_from_rational(5, 2); + assert_eq!(n.ceil(), 3.into()); + + let n = $name::saturating_from_rational(-5, 2); + assert_eq!(n.ceil(), (-2).into()); + + // On the limits: + let n = $name::max_value(); + assert_eq!(n.ceil(), n.trunc()); + + let n = $name::min_value(); + assert_eq!(n.ceil(), n.trunc()); + } + + #[test] + fn floor_works() { + let n = $name::saturating_from_rational(5, 2); + assert_eq!(n.floor(), 2.into()); + + let n = $name::saturating_from_rational(-5, 2); + assert_eq!(n.floor(), (-3).into()); + + // On the limits: + let n = $name::max_value(); + assert_eq!(n.floor(), n.trunc()); + + let n = $name::min_value(); + assert_eq!(n.floor(), n.trunc()); + } + + #[test] + fn round_works() { + let n = $name::zero(); + assert_eq!(n.round(), n); + + let n = $name::one(); + assert_eq!(n.round(), n); + + let n = $name::saturating_from_rational(5, 2); + assert_eq!(n.round(), 3.into()); + + let n = $name::saturating_from_rational(-5, 2); + assert_eq!(n.round(), (-3).into()); + + // Saturating: + let n = $name::max_value(); + assert_eq!(n.round(), n.trunc()); + + let n = $name::min_value(); + assert_eq!(n.round(), n.trunc()); + + // On the limit: + + // floor(max - 1) + 0.33.. + let n = $name::max_value() + .saturating_sub(1.into()) + .trunc() + .saturating_add((1, 3).into()); + + assert_eq!(n.round(), ($name::max_value() - 1.into()).trunc()); + + // floor(min + 1) - 0.33.. + let n = $name::min_value() + .saturating_add(1.into()) + .trunc() + .saturating_sub((1, 3).into()); + + assert_eq!(n.round(), ($name::min_value() + 1.into()).trunc()); + + // floor(max - 1) + 0.5 + let n = $name::max_value() + .saturating_sub(1.into()) + .trunc() + .saturating_add((1, 2).into()); + + assert_eq!(n.round(), $name::max_value().trunc()); + + // floor(min + 1) - 0.5 + let n = $name::min_value() + .saturating_add(1.into()) + .trunc() + .saturating_sub((1, 2).into()); + + assert_eq!(n.round(), $name::min_value().trunc()); + } + + #[test] + fn perthing_into_works() { + let ten_percent_percent: $name = Percent::from_percent(10).into(); + assert_eq!(ten_percent_percent.into_inner(), $name::accuracy() / 10); + + let ten_percent_permill: $name = Permill::from_percent(10).into(); + assert_eq!(ten_percent_permill.into_inner(), $name::accuracy() / 10); + + let ten_percent_perbill: $name = Perbill::from_percent(10).into(); + assert_eq!(ten_percent_perbill.into_inner(), $name::accuracy() / 10); + + let ten_percent_perquintill: $name = Perquintill::from_percent(10).into(); + assert_eq!(ten_percent_perquintill.into_inner(), $name::accuracy() / 10); + } + + #[test] + fn fmt_should_work() { + let zero = $name::zero(); + assert_eq!(format!("{:?}", zero), format!("{}(0.{:0>weight$})", stringify!($name), 0, weight=precision())); + + let one = $name::one(); + assert_eq!(format!("{:?}", one), format!("{}(1.{:0>weight$})", stringify!($name), 0, weight=precision())); + + let neg = -$name::one(); + assert_eq!(format!("{:?}", neg), format!("{}(-1.{:0>weight$})", stringify!($name), 0, weight=precision())); + + let frac = $name::saturating_from_rational(1, 2); + assert_eq!(format!("{:?}", frac), format!("{}(0.{:0 Self { - Self(int.saturating_mul(DIV)) - } - - /// Accuracy of `Fixed128`. - pub const fn accuracy() -> i128 { - DIV - } - - /// Raw constructor. Equal to `parts / DIV`. - pub const fn from_parts(parts: i128) -> Self { - Self(parts) - } - - /// Creates self from a rational number. Equal to `n/d`. - /// - /// Note that this might be lossy. Only use this if you are sure that `n * DIV` can fit into an - /// i128. - pub fn from_rational>(n: N, d: NonZeroI128) -> Self { - let n = n.unique_saturated_into(); - Self(n.saturating_mul(DIV.into()) / d.get()) - } - - /// Consume self and return the inner raw `i128` value. - /// - /// Note this is a low level function, as the returned value is represented with accuracy. - pub fn deconstruct(self) -> i128 { - self.0 - } - - /// Takes the reciprocal(inverse) of Fixed128, 1/x - pub fn recip(&self) -> Option { - Self::from_natural(1i128).checked_div(self) - } - - /// Checked add. Same semantic to `num_traits::CheckedAdd`. - pub fn checked_add(&self, rhs: &Self) -> Option { - self.0.checked_add(rhs.0).map(Self) - } - - /// Checked sub. Same semantic to `num_traits::CheckedSub`. - pub fn checked_sub(&self, rhs: &Self) -> Option { - self.0.checked_sub(rhs.0).map(Self) - } - - /// Checked mul. Same semantic to `num_traits::CheckedMul`. - pub fn checked_mul(&self, rhs: &Self) -> Option { - let signum = self.0.signum() * rhs.0.signum(); - let mut lhs = self.0; - if lhs.is_negative() { - lhs = lhs.saturating_mul(-1); - } - let mut rhs: i128 = rhs.0.saturated_into(); - if rhs.is_negative() { - rhs = rhs.saturating_mul(-1); - } - - U256::from(lhs) - .checked_mul(U256::from(rhs)) - .and_then(|n| n.checked_div(U256::from(DIV))) - .and_then(|n| TryInto::::try_into(n).ok()) - .map(|n| Self(n * signum)) - } - - /// Checked div. Same semantic to `num_traits::CheckedDiv`. - pub fn checked_div(&self, rhs: &Self) -> Option { - if rhs.0.signum() == 0 { - return None; - } - if self.0 == 0 { - return Some(*self); - } - - let signum = self.0.signum() / rhs.0.signum(); - let mut lhs: i128 = self.0; - if lhs.is_negative() { - lhs = lhs.saturating_mul(-1); - } - let mut rhs: i128 = rhs.0.saturated_into(); - if rhs.is_negative() { - rhs = rhs.saturating_mul(-1); - } - - U256::from(lhs) - .checked_mul(U256::from(DIV)) - .and_then(|n| n.checked_div(U256::from(rhs))) - .and_then(|n| TryInto::::try_into(n).ok()) - .map(|n| Self(n * signum)) - } - - /// Checked mul for int type `N`. - pub fn checked_mul_int(&self, other: &N) -> Option - where - N: Copy + TryFrom + TryInto, - { - N::try_into(*other).ok().and_then(|rhs| { - let mut lhs = self.0; - if lhs.is_negative() { - lhs = lhs.saturating_mul(-1); - } - let mut rhs: i128 = rhs.saturated_into(); - let signum = self.0.signum() * rhs.signum(); - if rhs.is_negative() { - rhs = rhs.saturating_mul(-1); - } - - U256::from(lhs) - .checked_mul(U256::from(rhs)) - .and_then(|n| n.checked_div(U256::from(DIV))) - .and_then(|n| TryInto::::try_into(n).ok()) - .and_then(|n| TryInto::::try_into(n * signum).ok()) - }) - } - - /// Checked mul for int type `N`. - pub fn saturating_mul_int(&self, other: &N) -> N - where - N: Copy + TryFrom + TryInto + Bounded, - { - self.checked_mul_int(other).unwrap_or_else(|| { - N::try_into(*other) - .map(|n| n.signum()) - .map(|n| n * self.0.signum()) - .map(|signum| { - if signum.is_negative() { - Bounded::min_value() - } else { - Bounded::max_value() - } - }) - .unwrap_or(Bounded::max_value()) - }) - } - - /// Checked div for int type `N`. - pub fn checked_div_int(&self, other: &N) -> Option - where - N: Copy + TryFrom + TryInto, - { - N::try_into(*other) - .ok() - .and_then(|n| self.0.checked_div(n)) - .and_then(|n| n.checked_div(DIV)) - .and_then(|n| TryInto::::try_into(n).ok()) - } - - pub fn zero() -> Self { - Self(0) - } - - pub fn is_zero(&self) -> bool { - self.0 == 0 - } - - /// Saturating absolute value. Returning MAX if `parts` == i128::MIN instead of overflowing. - pub fn saturating_abs(&self) -> Self { - if self.0 == i128::min_value() { - return Fixed128::max_value(); - } - - if self.0.is_negative() { - Fixed128::from_parts(self.0 * -1) - } else { - *self - } - } - - pub fn is_positive(&self) -> bool { - self.0.is_positive() - } - - pub fn is_negative(&self) -> bool { - self.0.is_negative() - } - - /// Performs a saturated multiply and accumulate by unsigned number. - /// - /// Returns a saturated `int + (self * int)`. - pub fn saturated_multiply_accumulate(self, int: N) -> N - where - N: TryFrom + From + UniqueSaturatedInto + Bounded + Clone + Saturating + - ops::Rem + ops::Div + ops::Mul + - ops::Add, - { - let div = DIV as u128; - let positive = self.0 > 0; - // safe to convert as absolute value. - let parts = self.0.checked_abs().map(|v| v as u128).unwrap_or(i128::max_value() as u128 + 1); - - - // will always fit. - let natural_parts = parts / div; - // might saturate. - let natural_parts: N = natural_parts.saturated_into(); - // fractional parts can always fit into u64. - let perquintill_parts = (parts % div) as u64; - - let n = int.clone().saturating_mul(natural_parts); - let p = Perquintill::from_parts(perquintill_parts) * int.clone(); - - // everything that needs to be either added or subtracted from the original weight. - let excess = n.saturating_add(p); - - if positive { - int.saturating_add(excess) - } else { - int.saturating_sub(excess) - } - } -} - -/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait -/// for safe addition. -impl ops::Add for Fixed128 { - type Output = Self; - - fn add(self, rhs: Self) -> Self::Output { - Self(self.0 + rhs.0) - } -} - -/// Note that this is a standard, _potentially-panicking_, implementation. Use `Saturating` trait -/// for safe subtraction. -impl ops::Sub for Fixed128 { - type Output = Self; - - fn sub(self, rhs: Self) -> Self::Output { - Self(self.0 - rhs.0) - } -} - -impl Saturating for Fixed128 { - fn saturating_add(self, rhs: Self) -> Self { - Self(self.0.saturating_add(rhs.0)) - } - - fn saturating_sub(self, rhs: Self) -> Self { - Self(self.0.saturating_sub(rhs.0)) - } - - fn saturating_mul(self, rhs: Self) -> Self { - self.checked_mul(&rhs).unwrap_or_else(|| { - if (self.0.signum() * rhs.0.signum()).is_negative() { - Bounded::min_value() - } else { - Bounded::max_value() - } - }) - } - - fn saturating_pow(self, exp: usize) -> Self { - if exp == 0 { - return Self::from_natural(1); - } - - let exp = exp as u64; - let msb_pos = 64 - exp.leading_zeros(); - - let mut result = Self::from_natural(1); - let mut pow_val = self; - for i in 0..msb_pos { - if ((1 << i) & exp) > 0 { - result = result.saturating_mul(pow_val); - } - pow_val = pow_val.saturating_mul(pow_val); - } - result - } -} - -impl Bounded for Fixed128 { - fn min_value() -> Self { - Self(Bounded::min_value()) - } - - fn max_value() -> Self { - Self(Bounded::max_value()) - } -} - -impl fmt::Debug for Fixed128 { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let integral = { - let int = self.0 / DIV; - let signum_for_zero = if int == 0 && self.is_negative() { "-" } else { "" }; - format!("{}{}", signum_for_zero, int) - }; - let fractional = format!("{:0>18}", (self.0 % DIV).abs()); - write!(f, "Fixed128({}.{})", integral, fractional) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut fmt::Formatter) -> fmt::Result { - Ok(()) - } -} - -impl From

for Fixed128 { - fn from(val: P) -> Self { - let accuracy = P::ACCURACY.saturated_into().max(1) as i128; - let value = val.deconstruct().saturated_into() as i128; - Fixed128::from_rational(value, NonZeroI128::new(accuracy).unwrap()) - } -} - -#[cfg(feature = "std")] -impl Fixed128 { - fn i128_str(&self) -> String { - format!("{}", &self.0) - } - - fn try_from_i128_str(s: &str) -> Result { - let parts: i128 = s.parse().map_err(|_| "invalid string input")?; - Ok(Self::from_parts(parts)) - } -} - -// Manual impl `Serialize` as serde_json does not support i128. -// TODO: remove impl if issue https://github.com/serde-rs/json/issues/548 fixed. -#[cfg(feature = "std")] -impl Serialize for Fixed128 { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.i128_str()) - } -} - -// Manual impl `Serialize` as serde_json does not support i128. -// TODO: remove impl if issue https://github.com/serde-rs/json/issues/548 fixed. -#[cfg(feature = "std")] -impl<'de> Deserialize<'de> for Fixed128 { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let s = String::deserialize(deserializer)?; - Fixed128::try_from_i128_str(&s).map_err(|err_str| de::Error::custom(err_str)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{Perbill, Percent, Permill, Perquintill}; - - fn max() -> Fixed128 { - Fixed128::max_value() - } - - fn min() -> Fixed128 { - Fixed128::min_value() - } - - #[test] - fn fixed128_semantics() { - let a = Fixed128::from_rational(5, NonZeroI128::new(2).unwrap()); - let b = Fixed128::from_rational(10, NonZeroI128::new(4).unwrap()); - assert_eq!(a.0, 5 * DIV / 2); - assert_eq!(a, b); - - let a = Fixed128::from_rational(-5, NonZeroI128::new(1).unwrap()); - assert_eq!(a, Fixed128::from_natural(-5)); - - let a = Fixed128::from_rational(5, NonZeroI128::new(-1).unwrap()); - assert_eq!(a, Fixed128::from_natural(-5)); - - // biggest value that can be created. - assert_ne!(max(), Fixed128::from_natural(170_141_183_460_469_231_731)); - assert_eq!(max(), Fixed128::from_natural(170_141_183_460_469_231_732)); - - // the smallest value that can be created. - assert_ne!(min(), Fixed128::from_natural(-170_141_183_460_469_231_731)); - assert_eq!(min(), Fixed128::from_natural(-170_141_183_460_469_231_732)); - } - - #[test] - fn fixed128_operation() { - let a = Fixed128::from_natural(2); - let b = Fixed128::from_natural(1); - assert_eq!(a.checked_add(&b), Some(Fixed128::from_natural(1 + 2))); - assert_eq!(a.checked_sub(&b), Some(Fixed128::from_natural(2 - 1))); - assert_eq!(a.checked_mul(&b), Some(Fixed128::from_natural(1 * 2))); - assert_eq!( - a.checked_div(&b), - Some(Fixed128::from_rational(2, NonZeroI128::new(1).unwrap())) - ); - - let a = Fixed128::from_rational(5, NonZeroI128::new(2).unwrap()); - let b = Fixed128::from_rational(3, NonZeroI128::new(2).unwrap()); - assert_eq!( - a.checked_add(&b), - Some(Fixed128::from_rational(8, NonZeroI128::new(2).unwrap())) - ); - assert_eq!( - a.checked_sub(&b), - Some(Fixed128::from_rational(2, NonZeroI128::new(2).unwrap())) - ); - assert_eq!( - a.checked_mul(&b), - Some(Fixed128::from_rational(15, NonZeroI128::new(4).unwrap())) - ); - assert_eq!( - a.checked_div(&b), - Some(Fixed128::from_rational(10, NonZeroI128::new(6).unwrap())) - ); - - let a = Fixed128::from_natural(120); - assert_eq!(a.checked_div_int(&2i32), Some(60)); - - let a = Fixed128::from_rational(20, NonZeroI128::new(1).unwrap()); - assert_eq!(a.checked_div_int(&2i32), Some(10)); - - let a = Fixed128::from_natural(120); - assert_eq!(a.checked_mul_int(&2i32), Some(240)); - - let a = Fixed128::from_rational(1, NonZeroI128::new(2).unwrap()); - assert_eq!(a.checked_mul_int(&20i32), Some(10)); - - let a = Fixed128::from_rational(-1, NonZeroI128::new(2).unwrap()); - assert_eq!(a.checked_mul_int(&20i32), Some(-10)); - } - - #[test] - fn saturating_mul_should_work() { - let a = Fixed128::from_natural(-1); - assert_eq!(min().saturating_mul(a), max()); - - assert_eq!(Fixed128::from_natural(125).saturating_mul(a).deconstruct(), -125 * DIV); - - let a = Fixed128::from_rational(1, NonZeroI128::new(5).unwrap()); - assert_eq!(Fixed128::from_natural(125).saturating_mul(a).deconstruct(), 25 * DIV); - } - - #[test] - fn saturating_mul_int_works() { - let a = Fixed128::from_rational(10, NonZeroI128::new(1).unwrap()); - assert_eq!(a.saturating_mul_int(&i32::max_value()), i32::max_value()); - - let a = Fixed128::from_rational(-10, NonZeroI128::new(1).unwrap()); - assert_eq!(a.saturating_mul_int(&i32::max_value()), i32::min_value()); - - let a = Fixed128::from_rational(3, NonZeroI128::new(1).unwrap()); - assert_eq!(a.saturating_mul_int(&100i8), i8::max_value()); - - let a = Fixed128::from_rational(10, NonZeroI128::new(1).unwrap()); - assert_eq!(a.saturating_mul_int(&123i128), 1230); - - let a = Fixed128::from_rational(-10, NonZeroI128::new(1).unwrap()); - assert_eq!(a.saturating_mul_int(&123i128), -1230); - - assert_eq!(max().saturating_mul_int(&2i128), 340_282_366_920_938_463_463); - - assert_eq!(max().saturating_mul_int(&i128::min_value()), i128::min_value()); - - assert_eq!(min().saturating_mul_int(&i128::max_value()), i128::min_value()); - - assert_eq!(min().saturating_mul_int(&i128::min_value()), i128::max_value()); - } - - #[test] - fn zero_works() { - assert_eq!(Fixed128::zero(), Fixed128::from_natural(0)); - } - - #[test] - fn is_zero_works() { - assert!(Fixed128::zero().is_zero()); - assert!(!Fixed128::from_natural(1).is_zero()); - } - - #[test] - fn checked_div_with_zero_should_be_none() { - let a = Fixed128::from_natural(1); - let b = Fixed128::from_natural(0); - assert_eq!(a.checked_div(&b), None); - assert_eq!(b.checked_div(&a), Some(b)); - } - - #[test] - fn checked_div_int_with_zero_should_be_none() { - let a = Fixed128::from_natural(1); - assert_eq!(a.checked_div_int(&0i32), None); - let a = Fixed128::from_natural(0); - assert_eq!(a.checked_div_int(&1i32), Some(0)); - } - - #[test] - fn checked_div_with_zero_dividend_should_be_zero() { - let a = Fixed128::zero(); - let b = Fixed128::from_parts(1); - - assert_eq!(a.checked_div(&b), Some(Fixed128::zero())); - } - - #[test] - fn under_flow_should_be_none() { - let b = Fixed128::from_natural(1); - assert_eq!(min().checked_sub(&b), None); - } - - #[test] - fn over_flow_should_be_none() { - let a = Fixed128::from_parts(i128::max_value() - 1); - let b = Fixed128::from_parts(2); - assert_eq!(a.checked_add(&b), None); - - let a = Fixed128::max_value(); - let b = Fixed128::from_rational(2, NonZeroI128::new(1).unwrap()); - assert_eq!(a.checked_mul(&b), None); - - let a = Fixed128::from_natural(255); - let b = 2u8; - assert_eq!(a.checked_mul_int(&b), None); - - let a = Fixed128::from_natural(256); - let b = 1u8; - assert_eq!(a.checked_div_int(&b), None); - - let a = Fixed128::from_natural(256); - let b = -1i8; - assert_eq!(a.checked_div_int(&b), None); - } - - #[test] - fn checked_div_int_should_work() { - // 256 / 10 = 25 (25.6 as int = 25) - let a = Fixed128::from_natural(256); - let result = a.checked_div_int(&10i128).unwrap(); - assert_eq!(result, 25); - - // 256 / 100 = 2 (2.56 as int = 2) - let a = Fixed128::from_natural(256); - let result = a.checked_div_int(&100i128).unwrap(); - assert_eq!(result, 2); - - // 256 / 1000 = 0 (0.256 as int = 0) - let a = Fixed128::from_natural(256); - let result = a.checked_div_int(&1000i128).unwrap(); - assert_eq!(result, 0); - - // 256 / -1 = -256 - let a = Fixed128::from_natural(256); - let result = a.checked_div_int(&-1i128).unwrap(); - assert_eq!(result, -256); - - // -256 / -1 = 256 - let a = Fixed128::from_natural(-256); - let result = a.checked_div_int(&-1i128).unwrap(); - assert_eq!(result, 256); - - // 10 / -5 = -2 - let a = Fixed128::from_rational(20, NonZeroI128::new(2).unwrap()); - let result = a.checked_div_int(&-5i128).unwrap(); - assert_eq!(result, -2); - - // -170_141_183_460_469_231_731 / -2 = 85_070_591_730_234_615_865 - let result = min().checked_div_int(&-2i128).unwrap(); - assert_eq!(result, 85_070_591_730_234_615_865); - - // 85_070_591_730_234_615_865 * -2 = -170_141_183_460_469_231_730 - let result = Fixed128::from_natural(result).checked_mul_int(&-2i128).unwrap(); - assert_eq!(result, -170_141_183_460_469_231_730); - } - - #[test] - fn perthing_into_fixed_i128() { - let ten_percent_percent: Fixed128 = Percent::from_percent(10).into(); - assert_eq!(ten_percent_percent.deconstruct(), DIV / 10); - - let ten_percent_permill: Fixed128 = Permill::from_percent(10).into(); - assert_eq!(ten_percent_permill.deconstruct(), DIV / 10); - - let ten_percent_perbill: Fixed128 = Perbill::from_percent(10).into(); - assert_eq!(ten_percent_perbill.deconstruct(), DIV / 10); - - let ten_percent_perquintill: Fixed128 = Perquintill::from_percent(10).into(); - assert_eq!(ten_percent_perquintill.deconstruct(), DIV / 10); - } - - #[test] - fn recip_should_work() { - let a = Fixed128::from_natural(2); - assert_eq!( - a.recip(), - Some(Fixed128::from_rational(1, NonZeroI128::new(2).unwrap())) - ); - - let a = Fixed128::from_natural(2); - assert_eq!(a.recip().unwrap().checked_mul_int(&4i32), Some(2i32)); - - let a = Fixed128::from_rational(100, NonZeroI128::new(121).unwrap()); - assert_eq!( - a.recip(), - Some(Fixed128::from_rational(121, NonZeroI128::new(100).unwrap())) - ); - - let a = Fixed128::from_rational(1, NonZeroI128::new(2).unwrap()); - assert_eq!(a.recip().unwrap().checked_mul(&a), Some(Fixed128::from_natural(1))); - - let a = Fixed128::from_natural(0); - assert_eq!(a.recip(), None); - - let a = Fixed128::from_rational(-1, NonZeroI128::new(2).unwrap()); - assert_eq!(a.recip(), Some(Fixed128::from_natural(-2))); - } - - #[test] - fn serialize_deserialize_should_work() { - let two_point_five = Fixed128::from_rational(5, NonZeroI128::new(2).unwrap()); - let serialized = serde_json::to_string(&two_point_five).unwrap(); - assert_eq!(serialized, "\"2500000000000000000\""); - let deserialized: Fixed128 = serde_json::from_str(&serialized).unwrap(); - assert_eq!(deserialized, two_point_five); - - let minus_two_point_five = Fixed128::from_rational(-5, NonZeroI128::new(2).unwrap()); - let serialized = serde_json::to_string(&minus_two_point_five).unwrap(); - assert_eq!(serialized, "\"-2500000000000000000\""); - let deserialized: Fixed128 = serde_json::from_str(&serialized).unwrap(); - assert_eq!(deserialized, minus_two_point_five); - } - - #[test] - fn saturating_abs_should_work() { - // normal - assert_eq!(Fixed128::from_parts(1).saturating_abs(), Fixed128::from_parts(1)); - assert_eq!(Fixed128::from_parts(-1).saturating_abs(), Fixed128::from_parts(1)); - - // saturating - assert_eq!(Fixed128::min_value().saturating_abs(), Fixed128::max_value()); - } - - #[test] - fn is_positive_negative_should_work() { - let positive = Fixed128::from_parts(1); - assert!(positive.is_positive()); - assert!(!positive.is_negative()); - - let negative = Fixed128::from_parts(-1); - assert!(!negative.is_positive()); - assert!(negative.is_negative()); - - let zero = Fixed128::zero(); - assert!(!zero.is_positive()); - assert!(!zero.is_negative()); - } - - #[test] - fn fmt_should_work() { - let positive = Fixed128::from_parts(1000000000000000001); - assert_eq!(format!("{:?}", positive), "Fixed128(1.000000000000000001)"); - let negative = Fixed128::from_parts(-1000000000000000001); - assert_eq!(format!("{:?}", negative), "Fixed128(-1.000000000000000001)"); - - let positive_fractional = Fixed128::from_parts(1); - assert_eq!(format!("{:?}", positive_fractional), "Fixed128(0.000000000000000001)"); - let negative_fractional = Fixed128::from_parts(-1); - assert_eq!(format!("{:?}", negative_fractional), "Fixed128(-0.000000000000000001)"); - - let zero = Fixed128::zero(); - assert_eq!(format!("{:?}", zero), "Fixed128(0.000000000000000000)"); - } - - #[test] - fn saturating_pow_should_work() { - assert_eq!(Fixed128::from_natural(2).saturating_pow(0), Fixed128::from_natural(1)); - assert_eq!(Fixed128::from_natural(2).saturating_pow(1), Fixed128::from_natural(2)); - assert_eq!(Fixed128::from_natural(2).saturating_pow(2), Fixed128::from_natural(4)); - assert_eq!(Fixed128::from_natural(2).saturating_pow(3), Fixed128::from_natural(8)); - assert_eq!(Fixed128::from_natural(2).saturating_pow(50), Fixed128::from_natural(1125899906842624)); - - assert_eq!(Fixed128::from_natural(1).saturating_pow(1000), Fixed128::from_natural(1)); - assert_eq!(Fixed128::from_natural(-1).saturating_pow(1000), Fixed128::from_natural(1)); - assert_eq!(Fixed128::from_natural(-1).saturating_pow(1001), Fixed128::from_natural(-1)); - assert_eq!(Fixed128::from_natural(1).saturating_pow(usize::max_value()), Fixed128::from_natural(1)); - assert_eq!(Fixed128::from_natural(-1).saturating_pow(usize::max_value()), Fixed128::from_natural(-1)); - assert_eq!(Fixed128::from_natural(-1).saturating_pow(usize::max_value() - 1), Fixed128::from_natural(1)); - - assert_eq!(Fixed128::from_natural(114209).saturating_pow(4), Fixed128::from_natural(170137997018538053761)); - assert_eq!(Fixed128::from_natural(114209).saturating_pow(5), Fixed128::max_value()); - - assert_eq!(Fixed128::from_natural(1).saturating_pow(usize::max_value()), Fixed128::from_natural(1)); - assert_eq!(Fixed128::from_natural(0).saturating_pow(usize::max_value()), Fixed128::from_natural(0)); - assert_eq!(Fixed128::from_natural(2).saturating_pow(usize::max_value()), Fixed128::max_value()); - } -} diff --git a/primitives/arithmetic/src/fixed64.rs b/primitives/arithmetic/src/fixed64.rs deleted file mode 100644 index 14baad543c..0000000000 --- a/primitives/arithmetic/src/fixed64.rs +++ /dev/null @@ -1,382 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2019-2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use sp_std::{ - ops, prelude::*, - convert::{TryFrom, TryInto}, -}; -use codec::{Encode, Decode}; -use crate::{ - Perbill, - traits::{ - SaturatedConversion, CheckedSub, CheckedAdd, CheckedDiv, Bounded, UniqueSaturatedInto, Saturating - } -}; - -/// An unsigned fixed point number. Can hold any value in the range [-9_223_372_036, 9_223_372_036] -/// with fixed point accuracy of one billion. -#[derive(Encode, Decode, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub struct Fixed64(i64); - -/// The accuracy of the `Fixed64` type. -const DIV: i64 = 1_000_000_000; - -impl Fixed64 { - /// creates self from a natural number. - /// - /// Note that this might be lossy. - pub fn from_natural(int: i64) -> Self { - Self(int.saturating_mul(DIV)) - } - - /// Return the accuracy of the type. Given that this function returns the value `X`, it means - /// that an instance composed of `X` parts (`Fixed64::from_parts(X)`) is equal to `1`. - pub fn accuracy() -> i64 { - DIV - } - - /// Consume self and return the inner value. - pub fn into_inner(self) -> i64 { self.0 } - - /// Raw constructor. Equal to `parts / 1_000_000_000`. - pub fn from_parts(parts: i64) -> Self { - Self(parts) - } - - /// creates self from a rational number. Equal to `n/d`. - /// - /// Note that this might be lossy. - pub fn from_rational(n: i64, d: u64) -> Self { - Self( - (i128::from(n).saturating_mul(i128::from(DIV)) / i128::from(d).max(1)) - .try_into() - .unwrap_or_else(|_| Bounded::max_value()) - ) - } - - /// Performs a saturated multiply and accumulate by unsigned number. - /// - /// Returns a saturated `int + (self * int)`. - pub fn saturated_multiply_accumulate(self, int: N) -> N - where - N: TryFrom + From + UniqueSaturatedInto + Bounded + Clone + Saturating + - ops::Rem + ops::Div + ops::Mul + - ops::Add, - { - let div = DIV as u64; - let positive = self.0 > 0; - // safe to convert as absolute value. - let parts = self.0.checked_abs().map(|v| v as u64).unwrap_or(i64::max_value() as u64 + 1); - - - // will always fit. - let natural_parts = parts / div; - // might saturate. - let natural_parts: N = natural_parts.saturated_into(); - // fractional parts can always fit into u32. - let perbill_parts = (parts % div) as u32; - - let n = int.clone().saturating_mul(natural_parts); - let p = Perbill::from_parts(perbill_parts) * int.clone(); - - // everything that needs to be either added or subtracted from the original weight. - let excess = n.saturating_add(p); - - if positive { - int.saturating_add(excess) - } else { - int.saturating_sub(excess) - } - } - - pub fn is_negative(&self) -> bool { - self.0.is_negative() - } -} - -impl Saturating for Fixed64 { - fn saturating_add(self, rhs: Self) -> Self { - Self(self.0.saturating_add(rhs.0)) - } - - fn saturating_mul(self, rhs: Self) -> Self { - let a = self.0 as i128; - let b = rhs.0 as i128; - let res = a * b / DIV as i128; - Self(res.saturated_into()) - } - - fn saturating_sub(self, rhs: Self) -> Self { - Self(self.0.saturating_sub(rhs.0)) - } - - fn saturating_pow(self, exp: usize) -> Self { - if exp == 0 { - return Self::from_natural(1); - } - - let exp = exp as u64; - let msb_pos = 64 - exp.leading_zeros(); - - let mut result = Self::from_natural(1); - let mut pow_val = self; - for i in 0..msb_pos { - if ((1 << i) & exp) > 0 { - result = result.saturating_mul(pow_val); - } - pow_val = pow_val.saturating_mul(pow_val); - } - result - } -} - -/// Use `Saturating` trait for safe addition. -impl ops::Add for Fixed64 { - type Output = Self; - - fn add(self, rhs: Self) -> Self::Output { - Self(self.0 + rhs.0) - } -} - -/// Use `Saturating` trait for safe subtraction. -impl ops::Sub for Fixed64 { - type Output = Self; - - fn sub(self, rhs: Self) -> Self::Output { - Self(self.0 - rhs.0) - } -} - -/// Use `CheckedDiv` trait for safe division. -impl ops::Div for Fixed64 { - type Output = Self; - - fn div(self, rhs: Self) -> Self::Output { - if rhs.0 == 0 { - panic!("attempt to divide by zero"); - } - let (n, d) = if rhs.0 < 0 { - (-self.0, rhs.0.abs() as u64) - } else { - (self.0, rhs.0 as u64) - }; - Fixed64::from_rational(n, d) - } -} - -impl CheckedSub for Fixed64 { - fn checked_sub(&self, rhs: &Self) -> Option { - self.0.checked_sub(rhs.0).map(Self) - } -} - -impl CheckedAdd for Fixed64 { - fn checked_add(&self, rhs: &Self) -> Option { - self.0.checked_add(rhs.0).map(Self) - } -} - -impl CheckedDiv for Fixed64 { - fn checked_div(&self, rhs: &Self) -> Option { - if rhs.0 == 0 { - None - } else { - Some(*self / *rhs) - } - } -} - -impl sp_std::fmt::Debug for Fixed64 { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - let integral = { - let int = self.0 / DIV; - let signum_for_zero = if int == 0 && self.is_negative() { "-" } else { "" }; - format!("{}{}", signum_for_zero, int) - }; - let fractional = format!("{:0>9}", (self.0 % DIV).abs()); - write!(f, "Fixed64({}.{})", integral, fractional) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn max() -> Fixed64 { - Fixed64::from_parts(i64::max_value()) - } - - #[test] - fn fixed64_semantics() { - assert_eq!(Fixed64::from_rational(5, 2).0, 5 * 1_000_000_000 / 2); - assert_eq!(Fixed64::from_rational(5, 2), Fixed64::from_rational(10, 4)); - assert_eq!(Fixed64::from_rational(5, 0), Fixed64::from_rational(5, 1)); - - // biggest value that can be created. - assert_ne!(max(), Fixed64::from_natural(9_223_372_036)); - assert_eq!(max(), Fixed64::from_natural(9_223_372_037)); - } - - #[test] - fn fixed_64_growth_decrease_curve() { - let test_set = vec![0u32, 1, 10, 1000, 1_000_000_000]; - - // negative (1/2) - let mut fm = Fixed64::from_rational(-1, 2); - test_set.clone().into_iter().for_each(|i| { - assert_eq!(fm.saturated_multiply_accumulate(i) as i32, i as i32 - i as i32 / 2); - }); - - // unit (1) multiplier - fm = Fixed64::from_parts(0); - test_set.clone().into_iter().for_each(|i| { - assert_eq!(fm.saturated_multiply_accumulate(i), i); - }); - - // i.5 multiplier - fm = Fixed64::from_rational(1, 2); - test_set.clone().into_iter().for_each(|i| { - assert_eq!(fm.saturated_multiply_accumulate(i), i * 3 / 2); - }); - - // dual multiplier - fm = Fixed64::from_rational(1, 1); - test_set.clone().into_iter().for_each(|i| { - assert_eq!(fm.saturated_multiply_accumulate(i), i * 2); - }); - } - - macro_rules! saturating_mul_acc_test { - ($num_type:tt) => { - assert_eq!( - Fixed64::from_rational(100, 1).saturated_multiply_accumulate(10 as $num_type), - 1010, - ); - assert_eq!( - Fixed64::from_rational(100, 2).saturated_multiply_accumulate(10 as $num_type), - 510, - ); - assert_eq!( - Fixed64::from_rational(100, 3).saturated_multiply_accumulate(0 as $num_type), - 0, - ); - assert_eq!( - Fixed64::from_rational(5, 1).saturated_multiply_accumulate($num_type::max_value()), - $num_type::max_value() - ); - assert_eq!( - max().saturated_multiply_accumulate($num_type::max_value()), - $num_type::max_value() - ); - } - } - - #[test] - fn fixed64_multiply_accumulate_works() { - saturating_mul_acc_test!(u32); - saturating_mul_acc_test!(u64); - saturating_mul_acc_test!(u128); - } - - #[test] - fn div_works() { - let a = Fixed64::from_rational(12, 10); - let b = Fixed64::from_rational(10, 1); - assert_eq!(a / b, Fixed64::from_rational(12, 100)); - - let a = Fixed64::from_rational(12, 10); - let b = Fixed64::from_rational(1, 100); - assert_eq!(a / b, Fixed64::from_rational(120, 1)); - - let a = Fixed64::from_rational(12, 100); - let b = Fixed64::from_rational(10, 1); - assert_eq!(a / b, Fixed64::from_rational(12, 1000)); - - let a = Fixed64::from_rational(12, 100); - let b = Fixed64::from_rational(1, 100); - assert_eq!(a / b, Fixed64::from_rational(12, 1)); - - let a = Fixed64::from_rational(-12, 10); - let b = Fixed64::from_rational(10, 1); - assert_eq!(a / b, Fixed64::from_rational(-12, 100)); - - let a = Fixed64::from_rational(12, 10); - let b = Fixed64::from_rational(-10, 1); - assert_eq!(a / b, Fixed64::from_rational(-12, 100)); - - let a = Fixed64::from_rational(-12, 10); - let b = Fixed64::from_rational(-10, 1); - assert_eq!(a / b, Fixed64::from_rational(12, 100)); - } - - #[test] - #[should_panic(expected = "attempt to divide by zero")] - fn div_zero() { - let a = Fixed64::from_rational(12, 10); - let b = Fixed64::from_natural(0); - let _ = a / b; - } - - #[test] - fn checked_div_zero() { - let a = Fixed64::from_rational(12, 10); - let b = Fixed64::from_natural(0); - assert_eq!(a.checked_div(&b), None); - } - - #[test] - fn checked_div_non_zero() { - let a = Fixed64::from_rational(12, 10); - let b = Fixed64::from_rational(1, 100); - assert_eq!(a.checked_div(&b), Some(Fixed64::from_rational(120, 1))); - } - - #[test] - fn saturating_mul_should_work() { - assert_eq!(Fixed64::from_natural(100).saturating_mul(Fixed64::from_natural(100)), Fixed64::from_natural(10000)); - } - - #[test] - fn saturating_pow_should_work() { - assert_eq!(Fixed64::from_natural(2).saturating_pow(0), Fixed64::from_natural(1)); - assert_eq!(Fixed64::from_natural(2).saturating_pow(1), Fixed64::from_natural(2)); - assert_eq!(Fixed64::from_natural(2).saturating_pow(2), Fixed64::from_natural(4)); - assert_eq!(Fixed64::from_natural(2).saturating_pow(3), Fixed64::from_natural(8)); - assert_eq!(Fixed64::from_natural(2).saturating_pow(20), Fixed64::from_natural(1048576)); - - assert_eq!(Fixed64::from_natural(1).saturating_pow(1000), Fixed64::from_natural(1)); - assert_eq!(Fixed64::from_natural(-1).saturating_pow(1000), Fixed64::from_natural(1)); - assert_eq!(Fixed64::from_natural(-1).saturating_pow(1001), Fixed64::from_natural(-1)); - assert_eq!(Fixed64::from_natural(1).saturating_pow(usize::max_value()), Fixed64::from_natural(1)); - assert_eq!(Fixed64::from_natural(-1).saturating_pow(usize::max_value()), Fixed64::from_natural(-1)); - assert_eq!(Fixed64::from_natural(-1).saturating_pow(usize::max_value() - 1), Fixed64::from_natural(1)); - - assert_eq!(Fixed64::from_natural(309).saturating_pow(4), Fixed64::from_natural(9_116_621_361)); - assert_eq!(Fixed64::from_natural(309).saturating_pow(5), Fixed64::from_parts(i64::max_value())); - - assert_eq!(Fixed64::from_natural(1).saturating_pow(usize::max_value()), Fixed64::from_natural(1)); - assert_eq!(Fixed64::from_natural(0).saturating_pow(usize::max_value()), Fixed64::from_natural(0)); - assert_eq!(Fixed64::from_natural(2).saturating_pow(usize::max_value()), Fixed64::from_parts(i64::max_value())); - } -} diff --git a/primitives/arithmetic/src/lib.rs b/primitives/arithmetic/src/lib.rs index e5e7139d7b..0ac58b12fe 100644 --- a/primitives/arithmetic/src/lib.rs +++ b/primitives/arithmetic/src/lib.rs @@ -37,12 +37,10 @@ pub mod biguint; pub mod helpers_128bit; pub mod traits; mod per_things; -mod fixed64; -mod fixed128; +mod fixed; mod rational128; -pub use fixed64::Fixed64; -pub use fixed128::Fixed128; +pub use fixed::{FixedPointNumber, Fixed64, Fixed128}; pub use per_things::{PerThing, Percent, PerU16, Permill, Perbill, Perquintill}; pub use rational128::Rational128; diff --git a/primitives/arithmetic/src/traits.rs b/primitives/arithmetic/src/traits.rs index d8d789577e..7985f09a20 100644 --- a/primitives/arithmetic/src/traits.rs +++ b/primitives/arithmetic/src/traits.rs @@ -21,8 +21,8 @@ use sp_std::{self, convert::{TryFrom, TryInto}}; use codec::HasCompact; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{ - Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, - CheckedShl, CheckedShr, checked_pow + Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, CheckedNeg, + CheckedShl, CheckedShr, checked_pow, Signed }; use sp_std::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, diff --git a/primitives/runtime/src/lib.rs b/primitives/runtime/src/lib.rs index e2a489515f..79b9142459 100644 --- a/primitives/runtime/src/lib.rs +++ b/primitives/runtime/src/lib.rs @@ -72,7 +72,7 @@ pub use sp_core::RuntimeDebug; /// Re-export top-level arithmetic stuff. pub use sp_arithmetic::{ Perquintill, Perbill, Permill, Percent, PerU16, Rational128, Fixed64, Fixed128, - PerThing, traits::SaturatedConversion, + PerThing, traits::SaturatedConversion, FixedPointNumber, }; /// Re-export 128 bit helpers. pub use sp_arithmetic::helpers_128bit; -- GitLab From ddf219143ccceb6b91efe8d5e2f0d73f318f0675 Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 22 May 2020 07:38:31 +0800 Subject: [PATCH 103/150] chore(client): remove the unnecessary clap dep (#6107) --- Cargo.lock | 1 - client/cli/Cargo.toml | 1 - client/cli/src/error.rs | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef0584f4ce..23229c365c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5954,7 +5954,6 @@ dependencies = [ "app_dirs", "atty", "chrono", - "clap", "derive_more", "env_logger 0.7.1", "fdlimit", diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 1dc5f1a39f..406bb1becc 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -12,7 +12,6 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = "2.33.0" derive_more = "0.99.2" env_logger = "0.7.0" log = "0.4.8" diff --git a/client/cli/src/error.rs b/client/cli/src/error.rs index 23c2bf05f0..31f6e1c1ff 100644 --- a/client/cli/src/error.rs +++ b/client/cli/src/error.rs @@ -27,7 +27,7 @@ pub enum Error { /// Io error Io(std::io::Error), /// Cli error - Cli(clap::Error), + Cli(structopt::clap::Error), /// Service error Service(sc_service::Error), /// Client error -- GitLab From 6c2fdea1f321b44cda8531d5db19da50afa546f9 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Fri, 22 May 2020 19:04:20 +1200 Subject: [PATCH 104/150] make calls public (#6109) --- bin/node/runtime/src/lib.rs | 2 +- frame/membership/src/lib.rs | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 69c8e98316..6a02ad66cd 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -94,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 250, - impl_version: 1, + impl_version: 2, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 29c42f990c..669964c70c 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -119,7 +119,7 @@ decl_module! { /// /// May only be called from `AddOrigin` or root. #[weight = 50_000_000] - fn add_member(origin, who: T::AccountId) { + pub fn add_member(origin, who: T::AccountId) { T::AddOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; @@ -138,7 +138,7 @@ decl_module! { /// /// May only be called from `RemoveOrigin` or root. #[weight = 50_000_000] - fn remove_member(origin, who: T::AccountId) { + pub fn remove_member(origin, who: T::AccountId) { T::RemoveOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; @@ -160,7 +160,7 @@ decl_module! { /// /// Prime membership is *not* passed from `remove` to `add`, if extant. #[weight = 50_000_000] - fn swap_member(origin, remove: T::AccountId, add: T::AccountId) { + pub fn swap_member(origin, remove: T::AccountId, add: T::AccountId) { T::SwapOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; @@ -189,7 +189,7 @@ decl_module! { /// /// May only be called from `ResetOrigin` or root. #[weight = 50_000_000] - fn reset_members(origin, members: Vec) { + pub fn reset_members(origin, members: Vec) { T::ResetOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; @@ -212,7 +212,7 @@ decl_module! { /// /// Prime membership is passed from the origin account to `new`, if extant. #[weight = 50_000_000] - fn change_key(origin, new: T::AccountId) { + pub fn change_key(origin, new: T::AccountId) { let remove = ensure_signed(origin)?; if remove != new { @@ -240,7 +240,7 @@ decl_module! { /// Set the prime member. Must be a current member. #[weight = 50_000_000] - fn set_prime(origin, who: T::AccountId) { + pub fn set_prime(origin, who: T::AccountId) { T::PrimeOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; @@ -251,7 +251,7 @@ decl_module! { /// Remove the prime member if it exists. #[weight = 50_000_000] - fn clear_prime(origin) { + pub fn clear_prime(origin) { T::PrimeOrigin::try_origin(origin) .map(|_| ()) .or_else(ensure_root)?; -- GitLab From f822521adb0dce4025c3f89082a231f912ef43d0 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Fri, 22 May 2020 12:43:55 +0200 Subject: [PATCH 105/150] Add a note about the deprecation of register_notifications_protocol (#6111) --- client/network/src/service.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 4a52bfebdd..d9de0d05c4 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -559,13 +559,17 @@ impl NetworkService { /// Registers a new notifications protocol. /// - /// After that, you can call `write_notifications`. + /// After a protocol has been registered, you can call `write_notifications`. + /// + /// **Important**: This method is a work-around, and you are instead strongly encouraged to + /// pass the protocol in the `NetworkConfiguration::notifications_protocols` list instead. + /// If you have no other choice but to use this method, you are very strongly encouraged to + /// call it very early on. Any connection open will retain the protocols that were registered + /// then, and not any new one. /// /// Please call `event_stream` before registering a protocol, otherwise you may miss events /// about the protocol that you have registered. - /// - /// You are very strongly encouraged to call this method very early on. Any connection open - /// will retain the protocols that were registered then, and not any new one. + // TODO: remove this method after https://github.com/paritytech/substrate/issues/4587 pub fn register_notifications_protocol( &self, engine_id: ConsensusEngineId, -- GitLab From 2e8a0c08a7db5864862ee3226d346d4a2224ead3 Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Fri, 22 May 2020 13:14:26 +0200 Subject: [PATCH 106/150] Fix some flaky offchain HTTP tests (#6038) * http: Use assert_eq in tests for better debuggability * http: Use matches! macro instead of if let ... * http: Simplify some bits and pieces * http: Don't answer immediately in HTTP test server Sometimes it can happen that we receive the response immediately when testing the HTTP api due to kernel scheduling. Because of it, we add a marginal 10ms async-friendly delay to minimize the risk. * http: Use the same async runtime when testing HTTP API/worker * http: Return a future Delay only for non-zero Duration This allows to short-circuit in the response_wait logic and only send/not wait for response. --- client/offchain/src/api/http.rs | 51 +++++++++++++--------------- client/offchain/src/api/timestamp.rs | 14 ++++---- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/client/offchain/src/api/http.rs b/client/offchain/src/api/http.rs index a64fe03897..91a673872f 100644 --- a/client/offchain/src/api/http.rs +++ b/client/offchain/src/api/http.rs @@ -31,7 +31,7 @@ use fnv::FnvHashMap; use futures::{prelude::*, future, channel::mpsc}; use log::error; use sp_core::offchain::{HttpRequestId, Timestamp, HttpRequestStatus, HttpError}; -use std::{fmt, io::Read as _, mem, pin::Pin, task::Context, task::Poll}; +use std::{convert::TryFrom, fmt, io::Read as _, pin::Pin, task::{Context, Poll}}; use sp_utils::mpsc::{tracing_unbounded, TracingUnboundedSender, TracingUnboundedReceiver}; /// Creates a pair of [`HttpApi`] and [`HttpWorker`]. @@ -151,8 +151,8 @@ impl HttpApi { _ => return Err(()) }; - let name = hyper::header::HeaderName::from_bytes(name.as_bytes()).map_err(|_| ())?; - let value = hyper::header::HeaderValue::from_str(value).map_err(|_| ())?; + let name = hyper::header::HeaderName::try_from(name).map_err(drop)?; + let value = hyper::header::HeaderValue::try_from(value).map_err(drop)?; // Note that we're always appending headers and never replacing old values. // We assume here that the user knows what they're doing. request.headers_mut().append(name, value); @@ -185,7 +185,7 @@ impl HttpApi { future::MaybeDone::Done(Err(_)) => return Err(HttpError::IoError), future::MaybeDone::Future(_) | future::MaybeDone::Gone => { - debug_assert!(if let future::MaybeDone::Done(_) = deadline { true } else { false }); + debug_assert!(matches!(deadline, future::MaybeDone::Done(..))); return Err(HttpError::DeadlineReached) } }; @@ -347,7 +347,7 @@ impl HttpApi { if let future::MaybeDone::Done(msg) = next_msg { msg } else { - debug_assert!(if let future::MaybeDone::Done(_) = deadline { true } else { false }); + debug_assert!(matches!(deadline, future::MaybeDone::Done(..))); continue } }; @@ -585,25 +585,21 @@ impl Future for HttpWorker { match request { HttpWorkerRequest::Dispatched(mut future) => { // Check for an HTTP response from the Internet. - let mut response = match Future::poll(Pin::new(&mut future), cx) { + let response = match Future::poll(Pin::new(&mut future), cx) { Poll::Pending => { me.requests.push((id, HttpWorkerRequest::Dispatched(future))); continue }, Poll::Ready(Ok(response)) => response, - Poll::Ready(Err(err)) => { - let _ = me.to_api.unbounded_send(WorkerToApi::Fail { - id, - error: err, - }); + Poll::Ready(Err(error)) => { + let _ = me.to_api.unbounded_send(WorkerToApi::Fail { id, error }); continue; // don't insert the request back } }; // We received a response! Decompose it into its parts. - let status_code = response.status(); - let headers = mem::replace(response.headers_mut(), hyper::HeaderMap::new()); - let body = response.into_body(); + let (head, body) = response.into_parts(); + let (status_code, headers) = (head.status, head.headers); let (body_tx, body_rx) = mpsc::channel(3); let _ = me.to_api.unbounded_send(WorkerToApi::Response { @@ -691,15 +687,12 @@ mod tests { use crate::api::timestamp; use super::http; use sp_core::offchain::{HttpError, HttpRequestId, HttpRequestStatus, Duration}; + use futures::future; // Returns an `HttpApi` whose worker is ran in the background, and a `SocketAddr` to an HTTP // server that runs in the background as well. macro_rules! build_api_server { () => {{ - fn tokio_run(future: impl std::future::Future) { - let _ = tokio::runtime::Runtime::new().unwrap().block_on(future); - } - // We spawn quite a bit of HTTP servers here due to how async API // works for offchain workers, so be sure to raise the FD limit // (particularly useful for macOS where the default soft limit may @@ -707,11 +700,12 @@ mod tests { fdlimit::raise_fd_limit(); let (api, worker) = http(); - std::thread::spawn(move || tokio_run(worker)); let (addr_tx, addr_rx) = std::sync::mpsc::channel(); std::thread::spawn(move || { - tokio_run(async move { + let mut rt = tokio::runtime::Runtime::new().unwrap(); + let worker = rt.spawn(worker); + let server = rt.spawn(async move { let server = hyper::Server::bind(&"127.0.0.1:0".parse().unwrap()) .serve(hyper::service::make_service_fn(|_| { async move { Ok::<_, Infallible>(hyper::service::service_fn(move |_req| async move { @@ -721,8 +715,9 @@ mod tests { })) }})); let _ = addr_tx.send(server.local_addr()); - server.await + server.await.map_err(drop) }); + let _ = rt.block_on(future::join(worker, server)); }); (api, addr_rx.recv().unwrap()) }}; @@ -891,10 +886,10 @@ mod tests { #[test] fn response_headers_invalid_call() { let (mut api, addr) = build_api_server!(); - assert!(api.response_headers(HttpRequestId(0xdead)).is_empty()); + assert_eq!(api.response_headers(HttpRequestId(0xdead)), &[]); let id = api.request_start("POST", &format!("http://{}", addr)).unwrap(); - assert!(api.response_headers(id).is_empty()); + assert_eq!(api.response_headers(id), &[]); let id = api.request_start("POST", &format!("http://{}", addr)).unwrap(); api.request_write_body(id, &[], None).unwrap(); @@ -904,12 +899,12 @@ mod tests { let id = api.request_start("GET", &format!("http://{}", addr)).unwrap(); api.response_wait(&[id], None); - assert!(!api.response_headers(id).is_empty()); + assert_ne!(api.response_headers(id), &[]); let id = api.request_start("GET", &format!("http://{}", addr)).unwrap(); let mut buf = [0; 128]; while api.response_read_body(id, &mut buf, None).unwrap() != 0 {} - assert!(api.response_headers(id).is_empty()); + assert_eq!(api.response_headers(id), &[]); } #[test] @@ -917,11 +912,11 @@ mod tests { let (mut api, addr) = build_api_server!(); let id = api.request_start("POST", &format!("http://{}", addr)).unwrap(); - assert!(api.response_headers(id).is_empty()); + assert_eq!(api.response_headers(id), &[]); let id = api.request_start("POST", &format!("http://{}", addr)).unwrap(); api.request_add_header(id, "Foo", "Bar").unwrap(); - assert!(api.response_headers(id).is_empty()); + assert_eq!(api.response_headers(id), &[]); let id = api.request_start("GET", &format!("http://{}", addr)).unwrap(); api.request_add_header(id, "Foo", "Bar").unwrap(); @@ -930,7 +925,7 @@ mod tests { // where we haven't received any response yet. This test can theoretically fail if the // HTTP response comes back faster than the kernel schedules our thread, but that is highly // unlikely. - assert!(api.response_headers(id).is_empty()); + assert_eq!(api.response_headers(id), &[]); } #[test] diff --git a/client/offchain/src/api/timestamp.rs b/client/offchain/src/api/timestamp.rs index e5494fe70d..222d3273cb 100644 --- a/client/offchain/src/api/timestamp.rs +++ b/client/offchain/src/api/timestamp.rs @@ -51,12 +51,14 @@ pub fn timestamp_from_now(timestamp: Timestamp) -> Duration { pub fn deadline_to_future( deadline: Option, ) -> futures::future::MaybeDone { - use futures::future; + use futures::future::{self, Either}; - future::maybe_done(match deadline { - Some(deadline) => future::Either::Left( - futures_timer::Delay::new(timestamp_from_now(deadline)) - ), - None => future::Either::Right(future::pending()) + future::maybe_done(match deadline.map(timestamp_from_now) { + None => Either::Left(future::pending()), + // Only apply delay if we need to wait a non-zero duration + Some(duration) if duration <= Duration::from_secs(0) => + Either::Right(Either::Left(future::ready(()))), + Some(duration) => + Either::Right(Either::Right(futures_timer::Delay::new(duration))), }) } -- GitLab From 9aa7b8f8b8a9b56eb11b00398f697cd277c4b509 Mon Sep 17 00:00:00 2001 From: pscott <30843220+pscott@users.noreply.github.com> Date: Fri, 22 May 2020 13:50:25 +0200 Subject: [PATCH 107/150] Add JSON format to import blocks and set it as default (#5816) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add BlockStream Enum and utility fn * WIP: Modify import closure to work with BlockStream * Fix trait bounds * Working prototype * Revamp block importing * Add export_import_flow tests * Add comments and clean code * Add more comments in the import fn * Add link code to import function * Add condition when returning Ready(Ok(()) to make sure we've imported every block * Add check for imported blocks in JSON case * Use rest pattern * Fix compilation error for undeclared variable * Add polling and waker before pending * Print read_block_count instead of count * Simplify binary cli option with structopt * Update test to reflect changes in CLI api * Change Stream to take SignedBlock instead of B * Add comments to BlockStream * Move out logic to smaller functions for clearer code * Remove result over import_blocks return type * Check for error in command output rather than simply checking command exit status * Revamp export/import/revert testing * Fix minor typos and formatting errors Co-authored-by: Bastian Köcher * Remove unnecessary if condition in terminating condition Co-authored-by: Bastian Köcher * Explicit error instead of returning it as a string Co-authored-by: Bastian Köcher * Pass BlockStream to log_importing_status_updates and simplify matching arms for block stream * Use .contains() instead of regex match * Line break in match block; return future::ready instead of poll_fn * Update Cargo.lock * Add check so that queue doesn't grow too big * Use Iterator instead of Stream * Remove allow dead_code * Remove outdated comments Co-authored-by: Bastian Köcher * Return Errors instead of logging them * Simplify match arms Co-authored-by: Bastian Köcher * Remove check before terminating block import * Apply suggestions from code review * Check that queue is not full BEFORE calling * Revert "Remove check before terminating block import" This reverts commit 377823c0a648a3eb2e61185a257a61023067893d. * Improve unit tests to make sure we actually import blocks * Remove Unpin implementation for BlockIter * Add prototype of enum for ImportStates * Add working prototype for StateMachine * Add comments for clearer code * Add sleep before calling Waker when waiting for import queue * Add Speedometer * add dbg!(&log) for test debugging * Fix lines with more than 100 cols * Fix regex capture for test * Update regexes to take to capture the whole number * Rename Cmd to Command Co-authored-by: Gavin Wood * Actually rename Cmd to Command * Apply suggestions from code review Co-authored-by: Gavin Wood * Fix compilation errors for tests * Fix compilation errors from code review suggestion * Update bin/node/cli/tests/export_import_flow.rs Co-authored-by: Bastian Köcher Co-authored-by: Gavin Wood Co-authored-by: Benjamin Kampmann --- bin/node/cli/tests/check_block_works.rs | 2 +- bin/node/cli/tests/common.rs | 1 - bin/node/cli/tests/export_import_flow.rs | 212 ++++++++++ .../tests/import_export_and_revert_work.rs | 61 --- bin/node/cli/tests/inspect_works.rs | 2 +- bin/node/cli/tests/purge_chain_works.rs | 2 +- .../tests/running_the_node_and_interrupt.rs | 2 +- client/cli/src/commands/import_blocks_cmd.rs | 6 +- client/service/src/builder.rs | 1 + client/service/src/chain_ops.rs | 399 ++++++++++++++---- 10 files changed, 546 insertions(+), 142 deletions(-) create mode 100644 bin/node/cli/tests/export_import_flow.rs delete mode 100644 bin/node/cli/tests/import_export_and_revert_work.rs diff --git a/bin/node/cli/tests/check_block_works.rs b/bin/node/cli/tests/check_block_works.rs index 0b340dad64..34078b08cf 100644 --- a/bin/node/cli/tests/check_block_works.rs +++ b/bin/node/cli/tests/check_block_works.rs @@ -22,7 +22,7 @@ use assert_cmd::cargo::cargo_bin; use std::process::Command; use tempfile::tempdir; -mod common; +pub mod common; #[test] fn check_block_works() { diff --git a/bin/node/cli/tests/common.rs b/bin/node/cli/tests/common.rs index 51f88cd92b..61a07dd1ca 100644 --- a/bin/node/cli/tests/common.rs +++ b/bin/node/cli/tests/common.rs @@ -17,7 +17,6 @@ // along with this program. If not, see . #![cfg(unix)] -#![allow(dead_code)] use std::{process::{Child, ExitStatus}, thread, time::Duration, path::Path}; use assert_cmd::cargo::cargo_bin; diff --git a/bin/node/cli/tests/export_import_flow.rs b/bin/node/cli/tests/export_import_flow.rs new file mode 100644 index 0000000000..85a49b005a --- /dev/null +++ b/bin/node/cli/tests/export_import_flow.rs @@ -0,0 +1,212 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#![cfg(unix)] + +use assert_cmd::cargo::cargo_bin; +use std::{process::Command, fs, path::PathBuf}; +use tempfile::{tempdir, TempDir}; +use regex::Regex; + +pub mod common; + +fn contains_error(logged_output: &str) -> bool { + logged_output.contains("Error") +} + +/// Helper struct to execute the export/import/revert tests. +/// The fields are paths to a temporary directory +struct ExportImportRevertExecutor<'a> { + base_path: &'a TempDir, + exported_blocks_file: &'a PathBuf, + db_path: &'a PathBuf, + num_exported_blocks: Option, +} + +/// Format options for export / import commands. +enum FormatOpt { + Json, + Binary, +} + +/// Command corresponding to the different commands we would like to run. +enum SubCommand { + ExportBlocks, + ImportBlocks, +} + +impl ToString for SubCommand { + fn to_string(&self) -> String { + match self { + SubCommand::ExportBlocks => String::from("export-blocks"), + SubCommand::ImportBlocks => String::from("import-blocks"), + } + } +} + +impl<'a> ExportImportRevertExecutor<'a> { + fn new( + base_path: &'a TempDir, + exported_blocks_file: &'a PathBuf, + db_path: &'a PathBuf + ) -> Self { + Self { + base_path, + exported_blocks_file, + db_path, + num_exported_blocks: None, + } + } + + /// Helper method to run a command. Returns a string corresponding to what has been logged. + fn run_block_command(&self, + sub_command: SubCommand, + format_opt: FormatOpt, + expected_to_fail: bool + ) -> String { + let sub_command_str = sub_command.to_string(); + // Adding "--binary" if need be. + let arguments: Vec<&str> = match format_opt { + FormatOpt::Binary => vec![&sub_command_str, "--dev", "--pruning", "archive", "--binary", "-d"], + FormatOpt::Json => vec![&sub_command_str, "--dev", "--pruning", "archive", "-d"], + }; + + let tmp: TempDir; + // Setting base_path to be a temporary folder if we are importing blocks. + // This allows us to make sure we are importing from scratch. + let base_path = match sub_command { + SubCommand::ExportBlocks => &self.base_path.path(), + SubCommand::ImportBlocks => { + tmp = tempdir().unwrap(); + tmp.path() + } + }; + + // Running the command and capturing the output. + let output = Command::new(cargo_bin("substrate")) + .args(&arguments) + .arg(&base_path) + .arg(&self.exported_blocks_file) + .output() + .unwrap(); + + let logged_output = String::from_utf8_lossy(&output.stderr).to_string(); + + if expected_to_fail { + // Checking that we did indeed find an error. + assert!(contains_error(&logged_output), "expected to error but did not error!"); + assert!(!output.status.success()); + } else { + // Making sure no error were logged. + assert!(!contains_error(&logged_output), "expected not to error but error'd!"); + assert!(output.status.success()); + } + + logged_output + } + + /// Runs the `export-blocks` command. + fn run_export(&mut self, fmt_opt: FormatOpt) { + let log = self.run_block_command(SubCommand::ExportBlocks, fmt_opt, false); + + // Using regex to find out how many block we exported. + let re = Regex::new(r"Exporting blocks from #\d* to #(?P\d*)").unwrap(); + let caps = re.captures(&log).unwrap(); + // Saving the number of blocks we've exported for further use. + self.num_exported_blocks = Some(caps["exported_blocks"].parse::().unwrap()); + + let metadata = fs::metadata(&self.exported_blocks_file).unwrap(); + assert!(metadata.len() > 0, "file exported_blocks should not be empty"); + + let _ = fs::remove_dir_all(&self.db_path); + } + + /// Runs the `import-blocks` command, asserting that an error was found or + /// not depending on `expected_to_fail`. + fn run_import(&mut self, fmt_opt: FormatOpt, expected_to_fail: bool) { + let log = self.run_block_command(SubCommand::ImportBlocks, fmt_opt, expected_to_fail); + + if !expected_to_fail { + // Using regex to find out how much block we imported, + // and what's the best current block. + let re = Regex::new(r"Imported (?P\d*) blocks. Best: #(?P\d*)").unwrap(); + let caps = re.captures(&log).expect("capture should have succeeded"); + let imported = caps["imported"].parse::().unwrap(); + let best = caps["best"].parse::().unwrap(); + + assert_eq!( + imported, + best, + "numbers of blocks imported and best number differs" + ); + assert_eq!( + best, + self.num_exported_blocks.expect("number of exported blocks cannot be None; qed"), + "best block number and number of expected blocks should not differ" + ); + } + self.num_exported_blocks = None; + } + + /// Runs the `revert` command. + fn run_revert(&self) { + let output = Command::new(cargo_bin("substrate")) + .args(&["revert", "--dev", "--pruning", "archive", "-d"]) + .arg(&self.base_path.path()) + .output() + .unwrap(); + + let logged_output = String::from_utf8_lossy(&output.stderr).to_string(); + + // Reverting should not log any error. + assert!(!contains_error(&logged_output)); + // Command should never fail. + assert!(output.status.success()); + } + + /// Helper function that runs the whole export / import / revert flow and checks for errors. + fn run(&mut self, export_fmt: FormatOpt, import_fmt: FormatOpt, expected_to_fail: bool) { + self.run_export(export_fmt); + self.run_import(import_fmt, expected_to_fail); + self.run_revert(); + } +} + +#[test] +fn export_import_revert() { + let base_path = tempdir().expect("could not create a temp dir"); + let exported_blocks_file = base_path.path().join("exported_blocks"); + let db_path = base_path.path().join("db"); + + common::run_dev_node_for_a_while(base_path.path()); + + let mut executor = ExportImportRevertExecutor::new( + &base_path, + &exported_blocks_file, + &db_path, + ); + + // Binary and binary should work. + executor.run(FormatOpt::Binary, FormatOpt::Binary, false); + // Binary and JSON should fail. + executor.run(FormatOpt::Binary, FormatOpt::Json, true); + // JSON and JSON should work. + executor.run(FormatOpt::Json, FormatOpt::Json, false); + // JSON and binary should fail. + executor.run(FormatOpt::Json, FormatOpt::Binary, true); +} diff --git a/bin/node/cli/tests/import_export_and_revert_work.rs b/bin/node/cli/tests/import_export_and_revert_work.rs deleted file mode 100644 index 91c8b024e1..0000000000 --- a/bin/node/cli/tests/import_export_and_revert_work.rs +++ /dev/null @@ -1,61 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) 2020 Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#![cfg(unix)] - -use assert_cmd::cargo::cargo_bin; -use std::{process::Command, fs}; -use tempfile::tempdir; - -mod common; - -#[test] -fn import_export_and_revert_work() { - let base_path = tempdir().expect("could not create a temp dir"); - let exported_blocks = base_path.path().join("exported_blocks"); - - common::run_dev_node_for_a_while(base_path.path()); - - let status = Command::new(cargo_bin("substrate")) - .args(&["export-blocks", "--dev", "--pruning", "archive", "-d"]) - .arg(base_path.path()) - .arg(&exported_blocks) - .status() - .unwrap(); - assert!(status.success()); - - let metadata = fs::metadata(&exported_blocks).unwrap(); - assert!(metadata.len() > 0, "file exported_blocks should not be empty"); - - let _ = fs::remove_dir_all(base_path.path().join("db")); - - let status = Command::new(cargo_bin("substrate")) - .args(&["import-blocks", "--dev", "--pruning", "archive", "-d"]) - .arg(base_path.path()) - .arg(&exported_blocks) - .status() - .unwrap(); - assert!(status.success()); - - let status = Command::new(cargo_bin("substrate")) - .args(&["revert", "--dev", "--pruning", "archive", "-d"]) - .arg(base_path.path()) - .status() - .unwrap(); - assert!(status.success()); -} diff --git a/bin/node/cli/tests/inspect_works.rs b/bin/node/cli/tests/inspect_works.rs index 59bdaf7de3..aa9653acad 100644 --- a/bin/node/cli/tests/inspect_works.rs +++ b/bin/node/cli/tests/inspect_works.rs @@ -22,7 +22,7 @@ use assert_cmd::cargo::cargo_bin; use std::process::Command; use tempfile::tempdir; -mod common; +pub mod common; #[test] fn inspect_works() { diff --git a/bin/node/cli/tests/purge_chain_works.rs b/bin/node/cli/tests/purge_chain_works.rs index 8d637be3e8..001bed8b13 100644 --- a/bin/node/cli/tests/purge_chain_works.rs +++ b/bin/node/cli/tests/purge_chain_works.rs @@ -20,7 +20,7 @@ use assert_cmd::cargo::cargo_bin; use std::process::Command; use tempfile::tempdir; -mod common; +pub mod common; #[test] #[cfg(unix)] diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs index a8c4be4695..bd79dcd77a 100644 --- a/bin/node/cli/tests/running_the_node_and_interrupt.rs +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -20,7 +20,7 @@ use assert_cmd::cargo::cargo_bin; use std::{convert::TryInto, process::Command, thread, time::Duration}; use tempfile::tempdir; -mod common; +pub mod common; #[test] #[cfg(unix)] diff --git a/client/cli/src/commands/import_blocks_cmd.rs b/client/cli/src/commands/import_blocks_cmd.rs index e138850c8b..a74f4d524c 100644 --- a/client/cli/src/commands/import_blocks_cmd.rs +++ b/client/cli/src/commands/import_blocks_cmd.rs @@ -41,6 +41,10 @@ pub struct ImportBlocksCmd { #[structopt(long = "default-heap-pages", value_name = "COUNT")] pub default_heap_pages: Option, + /// Try importing blocks from binary format rather than JSON. + #[structopt(long)] + pub binary: bool, + #[allow(missing_docs)] #[structopt(flatten)] pub shared_params: SharedParams, @@ -79,7 +83,7 @@ impl ImportBlocksCmd { }; builder(config)? - .import_blocks(file, false) + .import_blocks(file, false, self.binary) .await .map_err(Into::into) } diff --git a/client/service/src/builder.rs b/client/service/src/builder.rs index 16d78c49e1..d921606ea6 100644 --- a/client/service/src/builder.rs +++ b/client/service/src/builder.rs @@ -831,6 +831,7 @@ pub trait ServiceBuilderCommand { self, input: impl Read + Seek + Send + 'static, force: bool, + binary: bool, ) -> Pin> + Send>>; /// Performs the blocks export. diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 5c7dca0da7..0297ad5c90 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -25,10 +25,10 @@ use sc_chain_spec::ChainSpec; use log::{warn, info}; use futures::{future, prelude::*}; use sp_runtime::traits::{ - Block as BlockT, NumberFor, One, Zero, Header, SaturatedConversion + Block as BlockT, NumberFor, One, Zero, Header, SaturatedConversion, MaybeSerializeDeserialize, }; use sp_runtime::generic::{BlockId, SignedBlock}; -use codec::{Decode, Encode, IoReader}; +use codec::{Decode, Encode, IoReader as CodecIoReader}; use crate::client::{Client, LocalCallExecutor}; use sp_consensus::{ BlockOrigin, @@ -39,12 +39,250 @@ use sp_core::storage::{StorageKey, well_known_keys, ChildInfo, Storage, StorageC use sc_client_api::{StorageProvider, BlockBackend, UsageProvider}; use std::{io::{Read, Write, Seek}, pin::Pin, collections::HashMap}; +use std::{thread, time::{Duration, Instant}}; +use serde_json::{de::IoRead as JsonIoRead, Deserializer, StreamDeserializer}; +use std::convert::{TryFrom, TryInto}; +use sp_runtime::traits::{CheckedDiv, Saturating}; + +/// Number of blocks we will add to the queue before waiting for the queue to catch up. +const MAX_PENDING_BLOCKS: u64 = 1_024; + +/// Number of milliseconds to wait until next poll. +const DELAY_TIME: u64 = 2_000; + +/// Number of milliseconds that must have passed between two updates. +const TIME_BETWEEN_UPDATES: u64 = 3_000; /// Build a chain spec json pub fn build_spec(spec: &dyn ChainSpec, raw: bool) -> error::Result { spec.as_json(raw).map_err(Into::into) } + +/// Helper enum that wraps either a binary decoder (from parity-scale-codec), or a JSON decoder (from serde_json). +/// Implements the Iterator Trait, calling `next()` will decode the next SignedBlock and return it. +enum BlockIter where + R: std::io::Read + std::io::Seek, +{ + Binary { + // Total number of blocks we are expecting to decode. + num_expected_blocks: u64, + // Number of blocks we have decoded thus far. + read_block_count: u64, + // Reader to the data, used for decoding new blocks. + reader: CodecIoReader, + }, + Json { + // Nubmer of blocks we have decoded thus far. + read_block_count: u64, + // Stream to the data, used for decoding new blocks. + reader: StreamDeserializer<'static, JsonIoRead, SignedBlock>, + }, +} + +impl BlockIter where + R: Read + Seek + 'static, + B: BlockT + MaybeSerializeDeserialize, +{ + fn new(input: R, binary: bool) -> Result { + if binary { + let mut reader = CodecIoReader(input); + // If the file is encoded in binary format, it is expected to first specify the number + // of blocks that are going to be decoded. We read it and add it to our enum struct. + let num_expected_blocks: u64 = Decode::decode(&mut reader) + .map_err(|e| format!("Failed to decode the number of blocks: {:?}", e))?; + Ok(BlockIter::Binary { + num_expected_blocks, + read_block_count: 0, + reader, + }) + } else { + let stream_deser = Deserializer::from_reader(input) + .into_iter::>(); + Ok(BlockIter::Json { + reader: stream_deser, + read_block_count: 0, + }) + } + } + + /// Returns the number of blocks read thus far. + fn read_block_count(&self) -> u64 { + match self { + BlockIter::Binary { read_block_count, .. } + | BlockIter::Json { read_block_count, .. } + => *read_block_count, + } + } + + /// Returns the total number of blocks to be imported, if possible. + fn num_expected_blocks(&self) -> Option { + match self { + BlockIter::Binary { num_expected_blocks, ..} => Some(*num_expected_blocks), + BlockIter::Json {..} => None + } + } +} + +impl Iterator for BlockIter where + R: Read + Seek + 'static, + B: BlockT + MaybeSerializeDeserialize, +{ + type Item = Result, String>; + + fn next(&mut self) -> Option { + match self { + BlockIter::Binary { num_expected_blocks, read_block_count, reader } => { + if read_block_count < num_expected_blocks { + let block_result: Result, _> = SignedBlock::::decode(reader) + .map_err(|e| e.to_string()); + *read_block_count += 1; + Some(block_result) + } else { + // `read_block_count` == `num_expected_blocks` so we've read enough blocks. + None + } + } + BlockIter::Json { reader, read_block_count } => { + let res = Some(reader.next()?.map_err(|e| e.to_string())); + *read_block_count += 1; + res + } + } + } +} + +/// Imports the SignedBlock to the queue. +fn import_block_to_queue( + signed_block: SignedBlock, + queue: &mut TImpQu, + force: bool +) where + TBl: BlockT + MaybeSerializeDeserialize, + TImpQu: 'static + ImportQueue, +{ + let (header, extrinsics) = signed_block.block.deconstruct(); + let hash = header.hash(); + // import queue handles verification and importing it into the client. + queue.import_blocks(BlockOrigin::File, vec![ + IncomingBlock:: { + hash, + header: Some(header), + body: Some(extrinsics), + justification: signed_block.justification, + origin: None, + allow_missing_state: false, + import_existing: force, + } + ]); +} + +/// Returns true if we have imported every block we were supposed to import, else returns false. +fn importing_is_done( + num_expected_blocks: Option, + read_block_count: u64, + imported_blocks: u64 +) -> bool { + if let Some(num_expected_blocks) = num_expected_blocks { + imported_blocks >= num_expected_blocks + } else { + imported_blocks >= read_block_count + } +} + +/// Structure used to log the block importing speed. +struct Speedometer { + best_number: NumberFor, + last_number: Option>, + last_update: Instant, +} + +impl Speedometer { + /// Creates a fresh Speedometer. + fn new() -> Self { + Self { + best_number: NumberFor::::from(0), + last_number: None, + last_update: Instant::now(), + } + } + + /// Calculates `(best_number - last_number) / (now - last_update)` and + /// logs the speed of import. + fn display_speed(&self) { + // Number of milliseconds elapsed since last time. + let elapsed_ms = { + let elapsed = self.last_update.elapsed(); + let since_last_millis = elapsed.as_secs() * 1000; + let since_last_subsec_millis = elapsed.subsec_millis() as u64; + since_last_millis + since_last_subsec_millis + }; + + // Number of blocks that have been imported since last time. + let diff = match self.last_number { + None => return, + Some(n) => self.best_number.saturating_sub(n) + }; + + if let Ok(diff) = TryInto::::try_into(diff) { + // If the number of blocks can be converted to a regular integer, then it's easy: just + // do the math and turn it into a `f64`. + let speed = diff.saturating_mul(10_000).checked_div(u128::from(elapsed_ms)) + .map_or(0.0, |s| s as f64) / 10.0; + info!("📦 Current best block: {} ({:4.1} bps)", self.best_number, speed); + } else { + // If the number of blocks can't be converted to a regular integer, then we need a more + // algebraic approach and we stay within the realm of integers. + let one_thousand = NumberFor::::from(1_000); + let elapsed = NumberFor::::from( + >::try_from(elapsed_ms).unwrap_or(u32::max_value()) + ); + + let speed = diff.saturating_mul(one_thousand).checked_div(&elapsed) + .unwrap_or_else(Zero::zero); + info!("📦 Current best block: {} ({} bps)", self.best_number, speed) + } + } + + /// Updates the Speedometer. + fn update(&mut self, best_number: NumberFor) { + self.last_number = Some(self.best_number); + self.best_number = best_number; + self.last_update = Instant::now(); + } + + // If more than TIME_BETWEEN_UPDATES has elapsed since last update, + // then print and update the speedometer. + fn notify_user(&mut self, best_number: NumberFor) { + let delta = Duration::from_millis(TIME_BETWEEN_UPDATES); + if Instant::now().duration_since(self.last_update) >= delta { + self.display_speed(); + self.update(best_number); + } + } +} + +/// Different State that the `import_blocks` future could be in. +enum ImportState where + R: Read + Seek + 'static, + B: BlockT + MaybeSerializeDeserialize, +{ + /// We are reading from the BlockIter structure, adding those blocks to the queue if possible. + Reading{block_iter: BlockIter}, + /// The queue is full (contains at least MAX_PENDING_BLOCKS blocks) and we are waiting for it to catch up. + WaitingForImportQueueToCatchUp{ + block_iter: BlockIter, + delay: Duration, + block: SignedBlock + }, + // We have added all the blocks to the queue but they are still being processed. + WaitingForImportQueueToFinish{ + num_expected_blocks: Option, + read_block_count: u64, + delay: Duration, + }, +} + impl< TBl, TRtApi, TBackend, TExecDisp, TFchr, TSc, TImpQu, TFprb, TFpp, @@ -54,7 +292,7 @@ impl< Client>, TBl, TRtApi>, TFchr, TSc, TImpQu, TFprb, TFpp, TExPool, TRpc, Backend > where - TBl: BlockT, + TBl: BlockT + MaybeSerializeDeserialize, TBackend: 'static + sc_client_api::backend::Backend + Send, TExecDisp: 'static + NativeExecutionDispatch, TImpQu: 'static + ImportQueue, @@ -68,6 +306,7 @@ impl< mut self, input: impl Read + Seek + Send + 'static, force: bool, + binary: bool, ) -> Pin> + Send>> { struct WaitLink { imported_blocks: u64, @@ -87,7 +326,7 @@ impl< fn blocks_processed( &mut self, imported: usize, - _count: usize, + _num_expected_blocks: usize, results: Vec<(Result>, BlockImportError>, B::Hash)> ) { self.imported_blocks += imported as u64; @@ -102,10 +341,20 @@ impl< } } - let mut io_reader_input = IoReader(input); - let mut count = None::; - let mut read_block_count = 0; let mut link = WaitLink::new(); + let block_iter_res: Result, String> = BlockIter::new(input, binary); + + let block_iter = match block_iter_res { + Ok(block_iter) => block_iter, + Err(e) => { + // We've encountered an error while creating the block iterator + // so we can just return a future that returns an error. + return future::ready(Err(Error::Other(e))).boxed() + } + }; + + let mut state = Some(ImportState::Reading{block_iter}); + let mut speedometer = Speedometer::::new(); // Importing blocks is implemented as a future, because we want the operation to be // interruptible. @@ -117,85 +366,85 @@ impl< let import = future::poll_fn(move |cx| { let client = &self.client; let queue = &mut self.import_queue; - - // Start by reading the number of blocks if not done so already. - let count = match count { - Some(c) => c, - None => { - let c: u64 = match Decode::decode(&mut io_reader_input) { - Ok(c) => c, - Err(err) => { - let err = format!("Error reading file: {}", err); - return std::task::Poll::Ready(Err(From::from(err))); + match state.take().expect("state should never be None; qed") { + ImportState::Reading{mut block_iter} => { + match block_iter.next() { + None => { + // The iterator is over: we now need to wait for the import queue to finish. + let num_expected_blocks = block_iter.num_expected_blocks(); + let read_block_count = block_iter.read_block_count(); + let delay = Duration::from_millis(DELAY_TIME); + state = Some(ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay}); }, - }; - info!("📦 Importing {} blocks", c); - count = Some(c); - c - } - }; - - // Read blocks from the input. - if read_block_count < count { - match SignedBlock::::decode(&mut io_reader_input) { - Ok(signed) => { - let (header, extrinsics) = signed.block.deconstruct(); - let hash = header.hash(); - // import queue handles verification and importing it into the client - queue.import_blocks(BlockOrigin::File, vec![ - IncomingBlock:: { - hash, - header: Some(header), - body: Some(extrinsics), - justification: signed.justification, - origin: None, - allow_missing_state: false, - import_existing: force, + Some(block_result) => { + let read_block_count = block_iter.read_block_count(); + match block_result { + Ok(block) => { + if read_block_count - link.imported_blocks >= MAX_PENDING_BLOCKS { + // The queue is full, so do not add this block and simply wait until + // the queue has made some progress. + let delay = Duration::from_millis(DELAY_TIME); + state = Some(ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block}); + } else { + // Queue is not full, we can keep on adding blocks to the queue. + import_block_to_queue(block, queue, force); + state = Some(ImportState::Reading{block_iter}); + } + } + Err(e) => { + return std::task::Poll::Ready( + Err(Error::Other(format!("Error reading block #{}: {}", read_block_count, e)))) + } } - ]); + } + } + }, + ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block} => { + let read_block_count = block_iter.read_block_count(); + if read_block_count - link.imported_blocks >= MAX_PENDING_BLOCKS { + thread::sleep(delay); + // Queue is still full, so wait until there is room to insert our block. + state = Some(ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block}); + } else { + // Queue is no longer full, so we can add our block to the queue. + import_block_to_queue(block, queue, force); + // Switch back to Reading state. + state = Some(ImportState::Reading{block_iter}); } - Err(e) => { - warn!("Error reading block data at {}: {}", read_block_count, e); - return std::task::Poll::Ready(Ok(())); + }, + ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay} => { + // All the blocks have been added to the queue, which doesn't mean they + // have all been properly imported. + if importing_is_done(num_expected_blocks, read_block_count, link.imported_blocks) { + // Importing is done, we can log the result and return. + info!( + "🎉 Imported {} blocks. Best: #{}", + read_block_count, client.chain_info().best_number + ); + return std::task::Poll::Ready(Ok(())) + } else { + thread::sleep(delay); + // Importing is not done, we still have to wait for the queue to finish. + state = Some(ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay}); } } - - read_block_count += 1; - if read_block_count % 1000 == 0 { - info!("#{} blocks were added to the queue", read_block_count); - } - - cx.waker().wake_by_ref(); - return std::task::Poll::Pending; } - let blocks_before = link.imported_blocks; queue.poll_actions(cx, &mut link); - if link.has_error { - info!( - "Stopping after #{} blocks because of an error", - link.imported_blocks, - ); - return std::task::Poll::Ready(Ok(())); - } + let best_number = client.chain_info().best_number; + speedometer.notify_user(best_number); - if link.imported_blocks / 1000 != blocks_before / 1000 { - info!( - "#{} blocks were imported (#{} left)", - link.imported_blocks, - count - link.imported_blocks - ); + if link.has_error { + return std::task::Poll::Ready(Err( + Error::Other( + format!("Stopping after #{} blocks because of an error", link.imported_blocks) + ) + )) } - if link.imported_blocks >= count { - info!("🎉 Imported {} blocks. Best: #{}", read_block_count, client.chain_info().best_number); - return std::task::Poll::Ready(Ok(())); - - } else { - // Polling the import queue will re-schedule the task when ready. - return std::task::Poll::Pending; - } + cx.waker().wake_by_ref(); + std::task::Poll::Pending }); Box::pin(import) } @@ -295,7 +544,7 @@ impl< 1u64.encode_to(&mut buf); block.encode_to(&mut buf); let reader = std::io::Cursor::new(buf); - self.import_blocks(reader, true) + self.import_blocks(reader, true, true) } Ok(None) => Box::pin(future::err("Unknown block".into())), Err(e) => Box::pin(future::err(format!("Error reading block: {:?}", e).into())), -- GitLab From 1b41fe71e90cc486c89e85f6bb948909c2812bfd Mon Sep 17 00:00:00 2001 From: thiolliere Date: Fri, 22 May 2020 15:08:51 +0200 Subject: [PATCH 108/150] put max votes into metadata (#6114) --- frame/democracy/src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frame/democracy/src/lib.rs b/frame/democracy/src/lib.rs index ee9417ce0c..580e80cce0 100644 --- a/frame/democracy/src/lib.rs +++ b/frame/democracy/src/lib.rs @@ -652,6 +652,9 @@ decl_module! { /// The amount of balance that must be deposited per byte of preimage stored. const PreimageByteDeposit: BalanceOf = T::PreimageByteDeposit::get(); + /// The maximum number of votes for an account. + const MaxVotes: u32 = T::MaxVotes::get(); + fn deposit_event() = default; fn on_runtime_upgrade() -> Weight { -- GitLab From b3e0cb68129eef29fd4521b23c39d1c8dd2e28cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sat, 23 May 2020 11:28:34 +0200 Subject: [PATCH 109/150] Don't clone values when calculating storage root (#6108) * Don't clone values when calculating storage root Instead of cloning all the keys and values of the overlay when calculating the storage root, we pass all the values by reference. This should probably bring some performance improvements when calculating the storage root. * no cow version (#6113) Co-authored-by: cheme --- client/api/src/in_mem.rs | 17 +++-- client/db/src/bench.rs | 23 ++++--- client/db/src/lib.rs | 52 +++++++-------- client/db/src/storage_cache.rs | 34 ++++------ client/service/src/client/light/backend.rs | 31 ++++----- primitives/state-machine/src/backend.rs | 65 +++++++++---------- primitives/state-machine/src/basic.rs | 2 +- primitives/state-machine/src/ext.rs | 2 +- .../state-machine/src/overlayed_changes.rs | 24 ++++--- .../state-machine/src/proving_backend.rs | 32 ++++----- primitives/state-machine/src/trie_backend.rs | 36 +++++----- primitives/trie/src/lib.rs | 34 +++++----- 12 files changed, 165 insertions(+), 187 deletions(-) diff --git a/client/api/src/in_mem.rs b/client/api/src/in_mem.rs index 0eb0681a82..45c41fbcb7 100644 --- a/client/api/src/in_mem.rs +++ b/client/api/src/in_mem.rs @@ -21,9 +21,8 @@ use std::collections::HashMap; use std::sync::Arc; use parking_lot::RwLock; -use sp_core::storage::well_known_keys; -use sp_core::offchain::storage::{ - InMemOffchainStorage as OffchainStorage +use sp_core::{ + storage::well_known_keys, offchain::storage::InMemOffchainStorage as OffchainStorage, }; use sp_runtime::generic::BlockId; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor, HashFor}; @@ -519,13 +518,17 @@ impl backend::BlockImportOperation for BlockImportOperatio fn reset_storage(&mut self, storage: Storage) -> sp_blockchain::Result { check_genesis_storage(&storage)?; - let child_delta = storage.children_default.into_iter() + let child_delta = storage.children_default.iter() .map(|(_storage_key, child_content)| - (child_content.child_info, child_content.data.into_iter().map(|(k, v)| (k, Some(v))))); + ( + &child_content.child_info, + child_content.data.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))) + ) + ); let (root, transaction) = self.old_state.full_storage_root( - storage.top.into_iter().map(|(k, v)| (k, Some(v))), - child_delta + storage.top.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))), + child_delta, ); self.new_state = Some(transaction); diff --git a/client/db/src/bench.rs b/client/db/src/bench.rs index 807e8c68e1..99ce1edae0 100644 --- a/client/db/src/bench.rs +++ b/client/db/src/bench.rs @@ -79,12 +79,12 @@ impl BenchmarkingState { }; state.reopen()?; - let child_delta = genesis.children_default.into_iter().map(|(_storage_key, child_content)| ( - child_content.child_info, - child_content.data.into_iter().map(|(k, v)| (k, Some(v))), + let child_delta = genesis.children_default.iter().map(|(_storage_key, child_content)| ( + &child_content.child_info, + child_content.data.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))), )); let (root, transaction): (B::Hash, _) = state.state.borrow_mut().as_mut().unwrap().full_storage_root( - genesis.top.into_iter().map(|(k, v)| (k, Some(v))), + genesis.top.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))), child_delta, ); state.genesis = transaction.clone().drain(); @@ -193,19 +193,18 @@ impl StateBackend> for BenchmarkingState { } } - fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) where - I: IntoIterator, Option>)> - { + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (B::Hash, Self::Transaction) where B::Hash: Ord { self.state.borrow().as_ref().map_or(Default::default(), |s| s.storage_root(delta)) } - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (B::Hash, bool, Self::Transaction) where - I: IntoIterator, Option>)>, - { + delta: impl Iterator)>, + ) -> (B::Hash, bool, Self::Transaction) where B::Hash: Ord { self.state.borrow().as_ref().map_or(Default::default(), |s| s.child_storage_root(child_info, delta)) } diff --git a/client/db/src/lib.rs b/client/db/src/lib.rs index 037409dfc4..9fb8f3c8c0 100644 --- a/client/db/src/lib.rs +++ b/client/db/src/lib.rs @@ -212,21 +212,18 @@ impl StateBackend> for RefTrackingState { self.state.for_child_keys_with_prefix(child_info, prefix, f) } - fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) - where - I: IntoIterator, Option>)> - { + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (B::Hash, Self::Transaction) where B::Hash: Ord { self.state.storage_root(delta) } - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (B::Hash, bool, Self::Transaction) - where - I: IntoIterator, Option>)>, - { + delta: impl Iterator)>, + ) -> (B::Hash, bool, Self::Transaction) where B::Hash: Ord { self.state.child_storage_root(child_info, delta) } @@ -605,26 +602,25 @@ impl sc_client_api::backend::BlockImportOperation for Bloc &mut self, storage: Storage, ) -> ClientResult { - - if storage.top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { + if storage.top.keys().any(|k| well_known_keys::is_child_storage_key(&k)) { return Err(sp_blockchain::Error::GenesisInvalid.into()); } - let child_delta = storage.children_default.into_iter().map(|(_storage_key, child_content)|( - child_content.child_info, - child_content.data.into_iter().map(|(k, v)| (k, Some(v))), + let child_delta = storage.children_default.iter().map(|(_storage_key, child_content)|( + &child_content.child_info, + child_content.data.iter().map(|(k, v)| (&k[..], Some(&v[..]))), )); let mut changes_trie_config: Option = None; let (root, transaction) = self.old_state.full_storage_root( - storage.top.into_iter().map(|(k, v)| { - if k == well_known_keys::CHANGES_TRIE_CONFIG { + storage.top.iter().map(|(k, v)| { + if &k[..] == well_known_keys::CHANGES_TRIE_CONFIG { changes_trie_config = Some( Decode::decode(&mut &v[..]) .expect("changes trie configuration is encoded properly at genesis") ); } - (k, Some(v)) + (&k[..], Some(&v[..])) }), child_delta ); @@ -1810,13 +1806,12 @@ pub(crate) mod tests { header.state_root = op.old_state.storage_root(storage .iter() - .cloned() - .map(|(x, y)| (x, Some(y))) + .map(|(x, y)| (&x[..], Some(&y[..]))) ).0.into(); let hash = header.hash(); op.reset_storage(Storage { - top: storage.iter().cloned().collect(), + top: storage.into_iter().collect(), children_default: Default::default(), }).unwrap(); op.set_block_data( @@ -1853,7 +1848,10 @@ pub(crate) mod tests { (vec![5, 5, 5], Some(vec![4, 5, 6])), ]; - let (root, overlay) = op.old_state.storage_root(storage.iter().cloned()); + let (root, overlay) = op.old_state.storage_root( + storage.iter() + .map(|(k, v)| (&k[..], v.as_ref().map(|v| &v[..]))) + ); op.update_db_storage(overlay).unwrap(); header.state_root = root.into(); @@ -1892,17 +1890,11 @@ pub(crate) mod tests { extrinsics_root: Default::default(), }; - let storage: Vec<(_, _)> = vec![]; - - header.state_root = op.old_state.storage_root(storage - .iter() - .cloned() - .map(|(x, y)| (x, Some(y))) - ).0.into(); + header.state_root = op.old_state.storage_root(std::iter::empty()).0.into(); let hash = header.hash(); op.reset_storage(Storage { - top: storage.iter().cloned().collect(), + top: Default::default(), children_default: Default::default(), }).unwrap(); diff --git a/client/db/src/storage_cache.rs b/client/db/src/storage_cache.rs index 66ac74afa4..434b301ed6 100644 --- a/client/db/src/storage_cache.rs +++ b/client/db/src/storage_cache.rs @@ -621,21 +621,18 @@ impl>, B: BlockT> StateBackend> for Cachin self.state.for_child_keys_with_prefix(child_info, prefix, f) } - fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) - where - I: IntoIterator, Option>)>, - { + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (B::Hash, Self::Transaction) where B::Hash: Ord { self.state.storage_root(delta) } - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (B::Hash, bool, Self::Transaction) - where - I: IntoIterator, Option>)>, - { + delta: impl Iterator)>, + ) -> (B::Hash, bool, Self::Transaction) where B::Hash: Ord { self.state.child_storage_root(child_info, delta) } @@ -806,21 +803,18 @@ impl>, B: BlockT> StateBackend> for Syncin self.caching_state().for_child_keys_with_prefix(child_info, prefix, f) } - fn storage_root(&self, delta: I) -> (B::Hash, Self::Transaction) - where - I: IntoIterator, Option>)>, - { + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (B::Hash, Self::Transaction) where B::Hash: Ord { self.caching_state().storage_root(delta) } - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (B::Hash, bool, Self::Transaction) - where - I: IntoIterator, Option>)>, - { + delta: impl Iterator)>, + ) -> (B::Hash, bool, Self::Transaction) where B::Hash: Ord { self.caching_state().child_storage_root(child_info, delta) } diff --git a/client/service/src/client/light/backend.rs b/client/service/src/client/light/backend.rs index d336127131..2cf994d3f5 100644 --- a/client/service/src/client/light/backend.rs +++ b/client/service/src/client/light/backend.rs @@ -318,12 +318,12 @@ impl BlockImportOperation for ImportOperation storage.insert(None, input.top); // create a list of children keys to re-compute roots for - let child_delta = input.children_default.iter() - .map(|(_storage_key, storage_child)| (storage_child.child_info.clone(), None)) - .collect::>(); + let child_delta = input.children_default + .iter() + .map(|(_storage_key, storage_child)| (&storage_child.child_info, std::iter::empty())); // make sure to persist the child storage - for (_child_key, storage_child) in input.children_default { + for (_child_key, storage_child) in input.children_default.clone() { storage.insert(Some(storage_child.child_info), storage_child.data); } @@ -350,7 +350,11 @@ impl BlockImportOperation for ImportOperation Ok(()) } - fn mark_finalized(&mut self, block: BlockId, _justification: Option) -> ClientResult<()> { + fn mark_finalized( + &mut self, + block: BlockId, + _justification: Option, + ) -> ClientResult<()> { self.finalized_blocks.push(block); Ok(()) } @@ -459,10 +463,10 @@ impl StateBackend for GenesisOrUnavailableState } } - fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) - where - I: IntoIterator, Option>)> - { + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (H::Out, Self::Transaction) where H::Out: Ord { match *self { GenesisOrUnavailableState::Genesis(ref state) => state.storage_root(delta), @@ -470,14 +474,11 @@ impl StateBackend for GenesisOrUnavailableState } } - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (H::Out, bool, Self::Transaction) - where - I: IntoIterator, Option>)> - { + delta: impl Iterator)>, + ) -> (H::Out, bool, Self::Transaction) where H::Out: Ord { match *self { GenesisOrUnavailableState::Genesis(ref state) => { let (root, is_equal, _) = state.child_storage_root(child_info, delta); diff --git a/primitives/state-machine/src/backend.rs b/primitives/state-machine/src/backend.rs index f689357eb9..20a3ab7500 100644 --- a/primitives/state-machine/src/backend.rs +++ b/primitives/state-machine/src/backend.rs @@ -20,7 +20,6 @@ use hash_db::Hasher; use codec::{Decode, Encode}; use sp_core::{traits::RuntimeCode, storage::{ChildInfo, well_known_keys}}; - use crate::{ trie_backend::TrieBackend, trie_backend_essence::TrieBackendStorage, @@ -119,22 +118,19 @@ pub trait Backend: std::fmt::Debug { /// Calculate the storage root, with given delta over what is already stored in /// the backend, and produce a "transaction" that can be used to commit. /// Does not include child storage updates. - fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) - where - I: IntoIterator)>, - H::Out: Ord; + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (H::Out, Self::Transaction) where H::Out: Ord; /// Calculate the child storage root, with given delta over what is already stored in /// the backend, and produce a "transaction" that can be used to commit. The second argument /// is true if child storage root equals default storage root. - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (H::Out, bool, Self::Transaction) - where - I: IntoIterator)>, - H::Out: Ord; + delta: impl Iterator)>, + ) -> (H::Out, bool, Self::Transaction) where H::Out: Ord; /// Get all key/value pairs into a Vec. fn pairs(&self) -> Vec<(StorageKey, StorageValue)>; @@ -165,17 +161,14 @@ pub trait Backend: std::fmt::Debug { /// Calculate the storage root, with given delta over what is already stored /// in the backend, and produce a "transaction" that can be used to commit. /// Does include child storage updates. - fn full_storage_root( + fn full_storage_root<'a>( &self, - delta: I1, - child_deltas: I2) - -> (H::Out, Self::Transaction) - where - I1: IntoIterator)>, - I2i: IntoIterator)>, - I2: IntoIterator, - H::Out: Ord + Encode, - { + delta: impl Iterator)>, + child_deltas: impl Iterator)>, + )>, + ) -> (H::Out, Self::Transaction) where H::Out: Ord + Encode { let mut txs: Self::Transaction = Default::default(); let mut child_roots: Vec<_> = Default::default(); // child first @@ -190,8 +183,13 @@ pub trait Backend: std::fmt::Debug { child_roots.push((prefixed_storage_key.into_inner(), Some(child_root.encode()))); } } - let (root, parent_txs) = self.storage_root( - delta.into_iter().chain(child_roots.into_iter()) + let (root, parent_txs) = self.storage_root(delta + .map(|(k, v)| (&k[..], v.as_ref().map(|v| &v[..]))) + .chain( + child_roots + .iter() + .map(|(k, v)| (&k[..], v.as_ref().map(|v| &v[..]))) + ) ); txs.consolidate(parent_txs); (root, txs) @@ -214,7 +212,7 @@ pub trait Backend: std::fmt::Debug { } /// Commit given transaction to storage. - fn commit(&self, _storage_root: H::Out, _transaction: Self::Transaction) -> Result<(), Self::Error> { + fn commit(&self, _: H::Out, _: Self::Transaction) -> Result<(), Self::Error> { unimplemented!() } } @@ -269,23 +267,18 @@ impl<'a, T: Backend, H: Hasher> Backend for &'a T { (*self).for_child_keys_with_prefix(child_info, prefix, f) } - fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) - where - I: IntoIterator)>, - H::Out: Ord, - { + fn storage_root<'b>( + &self, + delta: impl Iterator)>, + ) -> (H::Out, Self::Transaction) where H::Out: Ord { (*self).storage_root(delta) } - fn child_storage_root( + fn child_storage_root<'b>( &self, child_info: &ChildInfo, - delta: I, - ) -> (H::Out, bool, Self::Transaction) - where - I: IntoIterator)>, - H::Out: Ord, - { + delta: impl Iterator)>, + ) -> (H::Out, bool, Self::Transaction) where H::Out: Ord { (*self).child_storage_root(child_info, delta) } diff --git a/primitives/state-machine/src/basic.rs b/primitives/state-machine/src/basic.rs index 7aa75cec70..917e41f33d 100644 --- a/primitives/state-machine/src/basic.rs +++ b/primitives/state-machine/src/basic.rs @@ -295,7 +295,7 @@ impl Externalities for BasicExternalities { child_info: &ChildInfo, ) -> Vec { if let Some(child) = self.inner.children_default.get(child_info.storage_key()) { - let delta = child.data.clone().into_iter().map(|(k, v)| (k, Some(v))); + let delta = child.data.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))); crate::in_memory_backend::new_in_mem::() .child_storage_root(&child.child_info, delta).0 } else { diff --git a/primitives/state-machine/src/ext.rs b/primitives/state-machine/src/ext.rs index 25c20644f7..7e805250e7 100644 --- a/primitives/state-machine/src/ext.rs +++ b/primitives/state-machine/src/ext.rs @@ -481,7 +481,7 @@ where if let Some(child_info) = self.overlay.default_child_info(storage_key) { let (root, is_empty, _) = { let delta = self.overlay.changes(Some(child_info)) - .map(|(k, v)| (k.clone(), v.value().cloned())); + .map(|(k, v)| (k.as_ref(), v.value().map(AsRef::as_ref))); self.backend.child_storage_root(child_info, delta) }; diff --git a/primitives/state-machine/src/overlayed_changes.rs b/primitives/state-machine/src/overlayed_changes.rs index 2da063c96e..b0259c2b85 100644 --- a/primitives/state-machine/src/overlayed_changes.rs +++ b/primitives/state-machine/src/overlayed_changes.rs @@ -26,13 +26,10 @@ use crate::{ stats::StateMachineStats, }; -#[cfg(test)] -use std::iter::FromIterator; -use std::collections::{HashMap, BTreeMap, BTreeSet}; +use std::{mem, ops, collections::{HashMap, BTreeMap, BTreeSet}}; use codec::{Decode, Encode}; use sp_core::storage::{well_known_keys::EXTRINSIC_INDEX, ChildInfo, ChildType}; use sp_core::offchain::storage::OffchainOverlayedChanges; -use std::{mem, ops}; use hash_db::Hasher; @@ -178,7 +175,7 @@ impl Default for StorageChanges } #[cfg(test)] -impl FromIterator<(StorageKey, OverlayedValue)> for OverlayedChangeSet { +impl std::iter::FromIterator<(StorageKey, OverlayedValue)> for OverlayedChangeSet { fn from_iter>(iter: T) -> Self { Self { top: iter.into_iter().collect(), @@ -646,22 +643,29 @@ impl OverlayedChanges { .chain(self.committed.children_default.keys()); let child_delta_iter = child_storage_keys.map(|storage_key| ( - self.default_child_info(storage_key).cloned() + self.default_child_info(storage_key) .expect("child info initialized in either committed or prospective"), self.committed.children_default.get(storage_key) .into_iter() - .flat_map(|(map, _)| map.iter().map(|(k, v)| (k.clone(), v.value.clone()))) + .flat_map(|(map, _)| + map.iter().map(|(k, v)| (&k[..], v.value().map(|v| &v[..]))) + ) .chain( self.prospective.children_default.get(storage_key) .into_iter() - .flat_map(|(map, _)| map.iter().map(|(k, v)| (k.clone(), v.value.clone()))) + .flat_map(|(map, _)| + map.iter().map(|(k, v)| (&k[..], v.value().map(|v| &v[..]))) + ) ), ) ); // compute and memoize - let delta = self.committed.top.iter().map(|(k, v)| (k.clone(), v.value.clone())) - .chain(self.prospective.top.iter().map(|(k, v)| (k.clone(), v.value.clone()))); + let delta = self.committed + .top + .iter() + .map(|(k, v)| (&k[..], v.value().map(|v| &v[..]))) + .chain(self.prospective.top.iter().map(|(k, v)| (&k[..], v.value().map(|v| &v[..])))); let (root, transaction) = backend.full_storage_root(delta, child_delta_iter); diff --git a/primitives/state-machine/src/proving_backend.rs b/primitives/state-machine/src/proving_backend.rs index 1d38d578a2..1f25005bc3 100644 --- a/primitives/state-machine/src/proving_backend.rs +++ b/primitives/state-machine/src/proving_backend.rs @@ -17,7 +17,7 @@ //! Proving state machine backend. -use std::sync::Arc; +use std::{sync::Arc, collections::HashMap}; use parking_lot::RwLock; use codec::{Decode, Codec}; use log::debug; @@ -26,13 +26,10 @@ use sp_trie::{ MemoryDB, empty_child_trie_root, read_trie_value_with, read_child_trie_value_with, record_all_keys, StorageProof, }; -pub use sp_trie::Recorder; -pub use sp_trie::trie_types::{Layout, TrieError}; +pub use sp_trie::{Recorder, trie_types::{Layout, TrieError}}; use crate::trie_backend::TrieBackend; use crate::trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage}; -use crate::{Error, ExecutionError, Backend}; -use std::collections::HashMap; -use crate::DBValue; +use crate::{Error, ExecutionError, Backend, DBValue}; use sp_core::storage::ChildInfo; /// Patricia trie-based backend specialized in get value proofs. @@ -260,21 +257,18 @@ impl<'a, S, H> Backend for ProvingBackend<'a, S, H> self.0.child_keys(child_info, prefix) } - fn storage_root(&self, delta: I) -> (H::Out, Self::Transaction) - where I: IntoIterator, Option>)> - { + fn storage_root<'b>( + &self, + delta: impl Iterator)>, + ) -> (H::Out, Self::Transaction) where H::Out: Ord { self.0.storage_root(delta) } - fn child_storage_root( + fn child_storage_root<'b>( &self, child_info: &ChildInfo, - delta: I, - ) -> (H::Out, bool, Self::Transaction) - where - I: IntoIterator, Option>)>, - H::Out: Ord - { + delta: impl Iterator)>, + ) -> (H::Out, bool, Self::Transaction) where H::Out: Ord { self.0.child_storage_root(child_info, delta) } @@ -393,9 +387,9 @@ mod tests { let in_memory = InMemoryBackend::::default(); let mut in_memory = in_memory.update(contents); let child_storage_keys = vec![child_info_1.to_owned(), child_info_2.to_owned()]; - let in_memory_root = in_memory.full_storage_root::<_, Vec<_>, _>( - ::std::iter::empty(), - child_storage_keys.into_iter().map(|k|(k.to_owned(), Vec::new())) + let in_memory_root = in_memory.full_storage_root( + std::iter::empty(), + child_storage_keys.iter().map(|k|(k, std::iter::empty())) ).0; (0..64).for_each(|i| assert_eq!( in_memory.storage(&[i]).unwrap().unwrap(), diff --git a/primitives/state-machine/src/trie_backend.rs b/primitives/state-machine/src/trie_backend.rs index 3016647191..2d4ab782cb 100644 --- a/primitives/state-machine/src/trie_backend.rs +++ b/primitives/state-machine/src/trie_backend.rs @@ -167,9 +167,10 @@ impl, H: Hasher> Backend for TrieBackend where collect_all().map_err(|e| debug!(target: "trie", "Error extracting trie keys: {}", e)).unwrap_or_default() } - fn storage_root(&self, delta: I) -> (H::Out, S::Overlay) - where I: IntoIterator)> - { + fn storage_root<'a>( + &self, + delta: impl Iterator)>, + ) -> (H::Out, Self::Transaction) where H::Out: Ord { let mut write_overlay = S::Overlay::default(); let mut root = *self.essence.root(); @@ -179,8 +180,7 @@ impl, H: Hasher> Backend for TrieBackend where &mut write_overlay, ); - let delta: Vec<_> = delta.into_iter().collect(); - match delta_trie_root::, _, _, _, _>(&mut eph, root, delta) { + match delta_trie_root::, _, _, _, _, _>(&mut eph, root, delta) { Ok(ret) => root = ret, Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e), } @@ -189,15 +189,11 @@ impl, H: Hasher> Backend for TrieBackend where (root, write_overlay) } - fn child_storage_root( + fn child_storage_root<'a>( &self, child_info: &ChildInfo, - delta: I, - ) -> (H::Out, bool, Self::Transaction) - where - I: IntoIterator)>, - H::Out: Ord, - { + delta: impl Iterator)>, + ) -> (H::Out, bool, Self::Transaction) where H::Out: Ord { let default_root = match child_info.child_type() { ChildType::ParentKeyId => empty_child_trie_root::>() }; @@ -219,11 +215,11 @@ impl, H: Hasher> Backend for TrieBackend where &mut write_overlay, ); - match child_delta_trie_root::, _, _, _, _, _>( + match child_delta_trie_root::, _, _, _, _, _, _>( child_info.keyspace(), &mut eph, root, - delta + delta, ) { Ok(ret) => root = ret, Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e), @@ -252,7 +248,7 @@ impl, H: Hasher> Backend for TrieBackend where #[cfg(test)] pub mod tests { - use std::collections::HashSet; + use std::{collections::HashSet, iter}; use sp_core::H256; use codec::Encode; use sp_trie::{TrieMut, PrefixedMemoryDB, trie_types::TrieDBMut, KeySpacedDBMut}; @@ -328,19 +324,21 @@ pub mod tests { #[test] fn storage_root_is_non_default() { - assert!(test_trie().storage_root(::std::iter::empty()).0 != H256::repeat_byte(0)); + assert!(test_trie().storage_root(iter::empty()).0 != H256::repeat_byte(0)); } #[test] fn storage_root_transaction_is_empty() { - assert!(test_trie().storage_root(::std::iter::empty()).1.drain().is_empty()); + assert!(test_trie().storage_root(iter::empty()).1.drain().is_empty()); } #[test] fn storage_root_transaction_is_non_empty() { - let (new_root, mut tx) = test_trie().storage_root(vec![(b"new-key".to_vec(), Some(b"new-value".to_vec()))]); + let (new_root, mut tx) = test_trie().storage_root( + iter::once((&b"new-key"[..], Some(&b"new-value"[..]))), + ); assert!(!tx.drain().is_empty()); - assert!(new_root != test_trie().storage_root(::std::iter::empty()).0); + assert!(new_root != test_trie().storage_root(iter::empty()).0); } #[test] diff --git a/primitives/trie/src/lib.rs b/primitives/trie/src/lib.rs index f328b71750..db471fd713 100644 --- a/primitives/trie/src/lib.rs +++ b/primitives/trie/src/lib.rs @@ -24,9 +24,7 @@ mod node_codec; mod storage_proof; mod trie_stream; -use sp_std::boxed::Box; -use sp_std::marker::PhantomData; -use sp_std::vec::Vec; +use sp_std::{boxed::Box, marker::PhantomData, vec::Vec, borrow::Borrow}; use hash_db::{Hasher, Prefix}; use trie_db::proof::{generate_proof, verify_proof}; pub use trie_db::proof::VerifyError; @@ -162,23 +160,24 @@ pub fn verify_trie_proof<'a, L: TrieConfiguration, I, K, V>( } /// Determine a trie root given a hash DB and delta values. -pub fn delta_trie_root( +pub fn delta_trie_root( db: &mut DB, mut root: TrieHash, delta: I ) -> Result, Box>> where - I: IntoIterator)>, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, + I: IntoIterator, + A: Borrow<[u8]>, + B: Borrow>, + V: Borrow<[u8]>, DB: hash_db::HashDB, { { let mut trie = TrieDBMut::::from_existing(&mut *db, &mut root)?; for (key, change) in delta { - match change { - Some(val) => trie.insert(key.as_ref(), val.as_ref())?, - None => trie.remove(key.as_ref())?, + match change.borrow() { + Some(val) => trie.insert(key.borrow(), val.borrow())?, + None => trie.remove(key.borrow())?, }; } } @@ -230,16 +229,17 @@ pub fn child_trie_root( /// Determine a child trie root given a hash DB and delta values. H is the default hasher, /// but a generic implementation may ignore this type parameter and use other hashers. -pub fn child_delta_trie_root( +pub fn child_delta_trie_root( keyspace: &[u8], db: &mut DB, root_data: RD, delta: I, ) -> Result<::Out, Box>> where - I: IntoIterator)>, - A: AsRef<[u8]> + Ord, - B: AsRef<[u8]>, + I: IntoIterator, + A: Borrow<[u8]>, + B: Borrow>, + V: Borrow<[u8]>, RD: AsRef<[u8]>, DB: hash_db::HashDB { @@ -252,9 +252,9 @@ pub fn child_delta_trie_root( let mut trie = TrieDBMut::::from_existing(&mut db, &mut root)?; for (key, change) in delta { - match change { - Some(val) => trie.insert(key.as_ref(), val.as_ref())?, - None => trie.remove(key.as_ref())?, + match change.borrow() { + Some(val) => trie.insert(key.borrow(), val.borrow())?, + None => trie.remove(key.borrow())?, }; } } -- GitLab From b8c493d0af30674f7d4a2ad6f179b264a295b1e9 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Sat, 23 May 2020 20:08:42 +0200 Subject: [PATCH 110/150] First draft of offchain phragmen weights (#6032) * Fist draft of offchain weights * Round of review feedback * Update frame/staking/src/lib.rs * Fix fuzzer * Remove some redundant comment * Weight refund for submit solution -- potentially revert. * First version with custom trimming of the result. * Update frame/staking/src/benchmarking.rs Co-authored-by: Alexander Popiak * Update frame/staking/src/benchmarking.rs Co-authored-by: Alexander Popiak * Apply suggestions from code review Co-authored-by: Alexander Popiak Co-authored-by: thiolliere * Update frame/staking/src/benchmarking.rs Co-authored-by: Alexander Popiak * Update frame/staking/src/benchmarking.rs Co-authored-by: Alexander Popiak * Some improvements * Benchmark submit solution without phragmen (PR for First draft of offchain phragmen weights) (#6073) * implementation of new benchmark * address comments * replace test * Update frame/staking/src/lib.rs Co-authored-by: Alexander Popiak * update weight * Fix refund * Clean and rady for final bench * Fix line-wdith * Fix gitlab build * Fix line-wdith * Fix test macro * Update frame/staking/src/lib.rs Co-authored-by: Alexander Popiak * Update frame/staking/src/benchmarking.rs Co-authored-by: Alexander Popiak * Better length check * Update frame/staking/src/lib.rs Co-authored-by: Alexander Popiak * Update final weight coefficients * Update frame/staking/src/lib.rs * Apply suggestions from code review * Update frame/staking/src/testing_utils.rs * Try and fix the line-width * Revert "Try and fix the line-width" This reverts commit b4e284727220085b9b3daf7682c4bbf29621da09. * Try and fix the line-width the correct way * Revert "Try and fix the line-width the correct way" This reverts commit 04fce128e851c9584f9f0d708a5a73cae799d8c8. Co-authored-by: Alexander Popiak Co-authored-by: thiolliere Co-authored-by: Gavin Wood --- .gitlab-ci.yml | 2 +- Cargo.lock | 798 ++++++++++---------- frame/staking/Cargo.toml | 20 +- frame/staking/fuzzer/Cargo.toml | 2 +- frame/staking/fuzzer/src/submit_solution.rs | 67 +- frame/staking/src/benchmarking.rs | 333 +++++--- frame/staking/src/lib.rs | 235 ++++-- frame/staking/src/offchain_election.rs | 20 +- frame/staking/src/testing_utils.rs | 384 +++++----- frame/staking/src/tests.rs | 133 ++-- frame/support/src/lib.rs | 1 + primitives/phragmen/compact/src/lib.rs | 39 + primitives/phragmen/src/tests.rs | 14 + utils/frame/benchmarking-cli/src/command.rs | 9 +- 14 files changed, 1202 insertions(+), 855 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d41a86f302..0944ec8cde 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -235,7 +235,7 @@ test-frame-staking: - $DEPLOY_TAG script: - cd frame/staking/ - - WASM_BUILD_NO_COLOR=1 time cargo test --release --verbose --no-default-features --features "std testing-utils" + - WASM_BUILD_NO_COLOR=1 time cargo test --release --verbose --no-default-features --features "std" - sccache -s test-frame-examples-compile-to-wasm: diff --git a/Cargo.lock b/Cargo.lock index 23229c365c..fc2c435b3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,6 +10,15 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456d75cbb82da1ad150c8a9d97285ffcd21c9931dcb11e995903e7d75141b38b" +dependencies = [ + "gimli 0.21.0", +] + [[package]] name = "adler32" version = "1.0.4" @@ -99,9 +108,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a60d744a80c30fcb657dfe2c1b22bcb3e814c1a1e3674f32bf5820b570fbff" +checksum = "2494382e9ba43995f3c56359e518641f450f5c36feeb4632a75cde2ec297c867" [[package]] name = "app_dirs" @@ -126,15 +135,15 @@ dependencies = [ [[package]] name = "arbitrary" -version = "0.4.1" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75153c95fdedd7db9732dfbfc3702324a1627eec91ba56e37cd0ac78314ab2ed" +checksum = "c5eb01a9ab8a3369f2f7632b9461c34f5920bd454774bab5b9fc6744f21d6143" [[package]] name = "arc-swap" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d663a8e9a99154b5fb793032533f6328da35e23aac63d5c152279aa8ba356825" +checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" [[package]] name = "arrayref" @@ -172,8 +181,8 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" dependencies = [ - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -237,7 +246,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95fd83426b89b034bf4e9ceb9c533c2f2386b813fd3dcae0a425ec6f1837d78a" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "rustls", "webpki", "webpki-roots 0.19.0", @@ -268,26 +277,17 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" -version = "0.3.46" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e" +checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" dependencies = [ - "backtrace-sys", + "addr2line", "cfg-if", "libc", + "object 0.19.0", "rustc-demangle", ] -[[package]] -name = "backtrace-sys" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8aba10a69c8e8d7622c5710229485ec32e9d55fdad160ea559c086fdcd118" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "base58" version = "0.1.0" @@ -302,9 +302,9 @@ checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "base64" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3" +checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" [[package]] name = "bincode" @@ -333,7 +333,7 @@ dependencies = [ "log", "peeking_take_while", "proc-macro2", - "quote 1.0.3", + "quote 1.0.5", "regex", "rustc-hash", "shlex", @@ -458,9 +458,9 @@ checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" [[package]] name = "bstr" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2889e6d50f394968c8bf4240dc3f2a7eb4680844d27308f798229ac9d4725f41" +checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" dependencies = [ "lazy_static", "memchr", @@ -479,9 +479,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ae9db68ad7fac5fe51304d20f016c911539251075a214f8e663babefa35187" +checksum = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" [[package]] name = "byte-slice-cast" @@ -553,9 +553,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.50" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" +checksum = "c3d87b23d6a92cd03af510a5ade527033f6aa6fa92161e2d5863a907d4c5e31d" dependencies = [ "jobserver", ] @@ -623,9 +623,9 @@ dependencies = [ [[package]] name = "clap" -version = "2.33.0" +version = "2.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" +checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" dependencies = [ "ansi_term 0.11.0", "atty", @@ -745,7 +745,7 @@ dependencies = [ "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli", + "gimli 0.20.0", "log", "regalloc", "serde", @@ -837,7 +837,7 @@ dependencies = [ "clap", "criterion-plot 0.3.1", "csv", - "itertools", + "itertools 0.8.2", "lazy_static", "libc", "num-traits 0.2.11", @@ -855,16 +855,16 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" +checksum = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" dependencies = [ "atty", "cast", "clap", - "criterion-plot 0.4.1", + "criterion-plot 0.4.2", "csv", - "itertools", + "itertools 0.9.0", "lazy_static", "num-traits 0.2.11", "oorandom", @@ -886,17 +886,17 @@ checksum = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" dependencies = [ "byteorder 1.3.4", "cast", - "itertools", + "itertools 0.8.2", ] [[package]] name = "criterion-plot" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" +checksum = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" dependencies = [ "cast", - "itertools", + "itertools 0.9.0", ] [[package]] @@ -1005,12 +1005,12 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c5e5ac752e18207b12e16b10631ae5f7f68f8805f335f9b817ead83d9ffce1" +checksum = "cf6b25ee9ac1995c54d7adb2eff8cfffb7260bc774fb63c601ec65467f43cd9d" dependencies = [ - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -1054,13 +1054,13 @@ checksum = "11c0346158a19b3627234e15596f5e465c360fcdb97d817bcb255e0510f5a788" [[package]] name = "derive_more" -version = "0.99.5" +version = "0.99.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2323f3f47db9a0e77ce7a300605d8d2098597fc451ed1a97bb1f6411bb550a7" +checksum = "46b046a346c374c6c3c84d2070bfe33904504686bdf949c2d8eb22edad3f270c" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -1147,22 +1147,22 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a80e524ebf194285b57e5e7944018721c7fffc673253f5183f7accd88a2a3b0c" +checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed9afacaea0301eefb738c9deea725e6d53938004597cdc518a8cf9a7aa2f03" +checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -1279,7 +1279,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", ] [[package]] @@ -1299,9 +1299,9 @@ dependencies = [ [[package]] name = "failure" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" dependencies = [ "backtrace", "failure_derive", @@ -1309,13 +1309,13 @@ dependencies = [ [[package]] name = "failure_derive" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "synstructure", ] @@ -1357,7 +1357,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8feb87a63249689640ac9c011742c33139204e3c134293d3054022276869133b" dependencies = [ "either", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 2.0.2", "log", "num-traits 0.2.11", @@ -1368,9 +1368,9 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32529fc42e86ec06e5047092082aab9ad459b070c5d2a76b14f4f5ce70bf2e84" +checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" dependencies = [ "byteorder 1.3.4", "rand 0.7.3", @@ -1505,8 +1505,8 @@ version = "2.0.0-dev" dependencies = [ "frame-support-procedural-tools", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -1516,8 +1516,8 @@ dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -1525,8 +1525,8 @@ name = "frame-support-procedural-tools-derive" version = "2.0.0-dev" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -1645,9 +1645,9 @@ checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" [[package]] name = "futures" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" +checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" dependencies = [ "futures-channel", "futures-core", @@ -1660,9 +1660,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" +checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" dependencies = [ "futures-core", "futures-sink", @@ -1679,9 +1679,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" +checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" [[package]] name = "futures-core-preview" @@ -1706,7 +1706,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdcef58a173af8148b182684c9f2d5250875adbcaff7b5794073894f9d8634a9" dependencies = [ "futures 0.1.29", - "futures 0.3.4", + "futures 0.3.5", "lazy_static", "log", "parking_lot 0.9.0", @@ -1717,9 +1717,9 @@ dependencies = [ [[package]] name = "futures-executor" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" +checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" dependencies = [ "futures-core", "futures-task", @@ -1729,33 +1729,36 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" [[package]] name = "futures-macro" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" +checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" dependencies = [ "proc-macro-hack", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] name = "futures-sink" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" +checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" [[package]] name = "futures-task" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" +checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +dependencies = [ + "once_cell", +] [[package]] name = "futures-timer" @@ -1775,9 +1778,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" +checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" dependencies = [ "futures 0.1.29", "futures-channel", @@ -1787,6 +1790,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", + "pin-project", "pin-utils", "proc-macro-hack", "proc-macro-nested", @@ -1812,7 +1816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" dependencies = [ "bytes 0.5.4", - "futures 0.3.4", + "futures 0.3.5", "memchr", "pin-project", ] @@ -1880,6 +1884,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "gimli" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" + [[package]] name = "glob" version = "0.2.11" @@ -1949,9 +1959,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42" +checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" dependencies = [ "bytes 0.5.4", "fnv", @@ -1962,7 +1972,7 @@ dependencies = [ "indexmap", "log", "slab", - "tokio 0.2.18", + "tokio 0.2.21", "tokio-util", ] @@ -2002,9 +2012,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e" +checksum = "61565ff7aaace3525556587bd2dc31d4a07071957be715e63ce7b1eccf51a8f4" dependencies = [ "libc", ] @@ -2157,15 +2167,15 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6081100e960d9d74734659ffc9cc91daf1c0fc7aceb8eaa94ee1a3f5046f2e" +checksum = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" dependencies = [ "bytes 0.5.4", "futures-channel", "futures-core", "futures-util", - "h2 0.2.4", + "h2 0.2.5", "http 0.2.1", "http-body 0.3.1", "httparse", @@ -2174,7 +2184,7 @@ dependencies = [ "net2", "pin-project", "time", - "tokio 0.2.18", + "tokio 0.2.21", "tower-service", "want 0.3.0", ] @@ -2188,11 +2198,11 @@ dependencies = [ "bytes 0.5.4", "ct-logs", "futures-util", - "hyper 0.13.4", + "hyper 0.13.5", "log", "rustls", "rustls-native-certs", - "tokio 0.2.18", + "tokio 0.2.21", "tokio-rustls", "webpki", ] @@ -2248,9 +2258,9 @@ dependencies = [ [[package]] name = "impl-serde" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bbe9ea9b182f0fb1cabbd61f4ff9b7b7b9197955e95a7e4c27de5055eb29ff8" +checksum = "b47ca4d2b6931707a55fce5cf66aff80e2178c8b63bbb4ecb5695cbc870ddf6f" dependencies = [ "serde", ] @@ -2262,8 +2272,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -2287,7 +2297,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64fa110ec7b8f493f416eed552740d10e7030ad5f63b2308f82c9608ec2df275" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "futures-timer 2.0.2", ] @@ -2321,6 +2331,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.5" @@ -2338,9 +2357,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.37" +version = "0.3.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a27d435371a2fa5b6d2b028a74bbdb1234f308da363226a2854ca3ff8ba7055" +checksum = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" dependencies = [ "wasm-bindgen", ] @@ -2392,8 +2411,8 @@ checksum = "8609af8f63b626e8e211f52441fcdb6ec54f1a446606b10d5c89ae9bf8a20058" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -2482,9 +2501,9 @@ dependencies = [ [[package]] name = "kv-log-macro" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" +checksum = "2a2d3beed37e5483887d81eb39de6de03a8346531410e1306ca48a9a89bd3a51" dependencies = [ "log", ] @@ -2534,7 +2553,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c7f36acb1841d4c701d30ae1f2cfd242e805991443f75f6935479ed3de64903" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "js-sys", "kvdb", "kvdb-memorydb", @@ -2565,22 +2584,28 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.69" +version = "0.2.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" +checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" [[package]] name = "libflate" -version = "0.1.27" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9135df43b1f5d0e333385cb6e7897ecd1a43d7d11b91ac003f4d2c2d2401fdd" +checksum = "a1fbe6b967a94346446d37ace319ae85be7eca261bb8149325811ac435d35d64" dependencies = [ "adler32", "crc32fast", + "libflate_lz77", "rle-decode-fast", - "take_mut", ] +[[package]] +name = "libflate_lz77" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3286f09f7d4926fc486334f28d8d2e6ebe4f7f9994494b6dab27ddfad2c9b11b" + [[package]] name = "libloading" version = "0.5.2" @@ -2604,7 +2629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ec214d189b57e4412f079ac5a1442578d06b12ca7282ba4696104cc92ab96c1" dependencies = [ "bytes 0.5.4", - "futures 0.3.4", + "futures 0.3.5", "lazy_static", "libp2p-core", "libp2p-core-derive", @@ -2646,7 +2671,7 @@ dependencies = [ "ed25519-dalek", "either", "fnv", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "lazy_static", "libsecp256k1", @@ -2675,8 +2700,8 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67f0d915bee5d457a6d113377101e1f06e86a4286778aa4c6939553e9a4d7033" dependencies = [ - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -2686,7 +2711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "975c847575ef9b3d63f9c11d465e9a9b0ea940cfa408b93cc6981bbc3b1bac40" dependencies = [ "flate2", - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", ] @@ -2696,7 +2721,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cc186d9a941fd0207cf8f08ef225a735e2d7296258f570155e525f6ee732f87" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "log", ] @@ -2709,7 +2734,7 @@ checksum = "c6dd8cc558e0edde2d4a423d017efd6b36c1b6bf97f4304c83076895c5edaed8" dependencies = [ "cuckoofilter", "fnv", - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "libp2p-swarm", "prost", @@ -2728,7 +2753,7 @@ dependencies = [ "byteorder 1.3.4", "bytes 0.5.4", "fnv", - "futures 0.3.4", + "futures 0.3.5", "futures_codec", "libp2p-core", "libp2p-swarm", @@ -2749,7 +2774,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a455af71c59473444eba05e83dbaa20262bdbd9b4154f22389510fbac16f201" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "libp2p-swarm", "log", @@ -2769,7 +2794,7 @@ dependencies = [ "bytes 0.5.4", "either", "fnv", - "futures 0.3.4", + "futures 0.3.5", "futures_codec", "libp2p-core", "libp2p-swarm", @@ -2796,7 +2821,7 @@ dependencies = [ "data-encoding", "dns-parser", "either", - "futures 0.3.4", + "futures 0.3.5", "lazy_static", "libp2p-core", "libp2p-swarm", @@ -2816,7 +2841,7 @@ checksum = "4095bce2100f840883f1f75dbd010c966ee4ad323ae9f82026396da5cf6cce68" dependencies = [ "bytes 0.5.4", "fnv", - "futures 0.3.4", + "futures 0.3.5", "futures_codec", "libp2p-core", "log", @@ -2831,7 +2856,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84fd504e27b0eadd451e06b67694ef714bd8374044e7db339bb0cdb83755ddf4" dependencies = [ "curve25519-dalek", - "futures 0.3.4", + "futures 0.3.5", "lazy_static", "libp2p-core", "log", @@ -2851,7 +2876,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82930c36490008b1ef2f26c237a2c205c38ef6edc263738d0528b842740ab09f" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "libp2p-swarm", "log", @@ -2867,7 +2892,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad28fe7beaa3e516ee8ba2af8c4f6820f269afa60d661831e879f2afea64f4a0" dependencies = [ "bytes 0.5.4", - "futures 0.3.4", + "futures 0.3.5", "futures_codec", "libp2p-core", "log", @@ -2884,7 +2909,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dabaa2194e1ce3c51cd78d734dd4c81dc5c7b150b309cbf9029df044034ac261" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "log", "pin-project", "rand 0.7.3", @@ -2900,7 +2925,7 @@ checksum = "22e30b873276846181fa9c04126653678c2797cb1556361d01b7b7fd6bf24682" dependencies = [ "aes-ctr", "ctr", - "futures 0.3.4", + "futures 0.3.5", "hmac", "js-sys", "lazy_static", @@ -2928,7 +2953,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4a8101a0e0d5f04562137a476bf5f5423cd5bdab2f7e43a75909668e63cb102" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "log", "rand 0.7.3", @@ -2944,7 +2969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4462bd96b97cac3f3a83b1b343ad3c3460cebbc8d929c040b1520c30e3611e08" dependencies = [ "async-std", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "get_if_addrs", "ipnet", @@ -2960,7 +2985,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69660d235449bb2d99333b9892c9176d06fd2b380490cb8213feb5b015678cf1" dependencies = [ "async-std", - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "log", ] @@ -2971,7 +2996,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f59fdbb5706f2723ca108c088b1c7a37f735a8c328021f0508007162627e9885" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "js-sys", "libp2p-core", "parity-send-wrapper", @@ -2988,7 +3013,7 @@ dependencies = [ "async-tls", "bytes 0.5.4", "either", - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "log", "quicksink", @@ -3006,7 +3031,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b305d3a8981e68f11c0e17f2d11d5c52fae95e0d7c283f9e462b5b2dab413b2" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "libp2p-core", "parking_lot 0.10.2", "thiserror", @@ -3055,9 +3080,9 @@ dependencies = [ [[package]] name = "linked-hash-map" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" +checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" [[package]] name = "linked_hash_set" @@ -3211,9 +3236,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.21" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" dependencies = [ "cfg-if", "fuchsia-zircon", @@ -3242,9 +3267,9 @@ dependencies = [ [[package]] name = "mio-uds" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" dependencies = [ "iovec", "libc", @@ -3297,7 +3322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74cdcf7cfb3402881e15a1f95116cb033d69b33c83d481e1234777f5ef0c3d2c" dependencies = [ "bytes 0.5.4", - "futures 0.3.4", + "futures 0.3.5", "log", "pin-project", "smallvec 1.4.0", @@ -3332,9 +3357,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" +checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" dependencies = [ "cfg-if", "libc", @@ -3401,7 +3426,7 @@ dependencies = [ name = "node-browser-testing" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "jsonrpc-core", "libp2p", @@ -3422,7 +3447,7 @@ dependencies = [ "frame-benchmarking-cli", "frame-support", "frame-system", - "futures 0.3.4", + "futures 0.3.5", "hex-literal", "jsonrpc-core", "log", @@ -3492,7 +3517,7 @@ dependencies = [ name = "node-executor" version = "2.0.0-dev" dependencies = [ - "criterion 0.3.1", + "criterion 0.3.2", "frame-benchmarking", "frame-support", "frame-system", @@ -3660,7 +3685,7 @@ dependencies = [ name = "node-template" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "log", "node-template-runtime", "parking_lot 0.10.2", @@ -3721,11 +3746,11 @@ dependencies = [ name = "node-testing" version = "2.0.0-dev" dependencies = [ - "criterion 0.3.1", + "criterion 0.3.2", "frame-support", "frame-system", "fs_extra", - "futures 0.3.4", + "futures 0.3.5", "log", "node-executor", "node-primitives", @@ -3787,9 +3812,9 @@ dependencies = [ [[package]] name = "ntapi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26e041cd983acbc087e30fcba770380cfa352d0e392e175b2344ebaf7ea0602" +checksum = "7a31937dea023539c72ddae0e3571deadc1414b300483fa7aaec176168cfa9d2" dependencies = [ "winapi 0.3.8", ] @@ -3858,9 +3883,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ "hermit-abi", "libc", @@ -3875,6 +3900,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "object" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" + [[package]] name = "ole32-sys" version = "0.2.0" @@ -3887,18 +3918,18 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" +checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" dependencies = [ - "parking_lot 0.9.0", + "parking_lot 0.10.2", ] [[package]] name = "oorandom" -version = "11.1.0" +version = "11.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" +checksum = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" [[package]] name = "opaque-debug" @@ -4548,13 +4579,11 @@ dependencies = [ "hex", "pallet-authorship", "pallet-balances", - "pallet-indices", "pallet-session", "pallet-staking-reward-curve", "pallet-timestamp", "parity-scale-codec", "parking_lot 0.10.2", - "rand 0.7.3", "rand_chacha 0.2.2", "serde", "sp-application-crypto", @@ -4596,9 +4625,9 @@ version = "2.0.0-dev" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.3", + "quote 1.0.5", "sp-runtime", - "syn 1.0.17", + "syn 1.0.21", ] [[package]] @@ -4829,8 +4858,8 @@ checksum = "5a0ec292e92e8ec7c58e576adacc1e3f399c597c8f263c42f18420abe58e7245" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -4861,7 +4890,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ "proc-macro2", - "syn 1.0.17", + "syn 1.0.21", "synstructure", ] @@ -4898,7 +4927,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ "lock_api", - "parking_lot_core 0.7.1", + "parking_lot_core 0.7.2", ] [[package]] @@ -4918,9 +4947,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e136c1904604defe99ce5fd71a28d473fa60a12255d511aa78a9ddf11237aeb" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" dependencies = [ "cfg-if", "cloudabi", @@ -4932,9 +4961,9 @@ dependencies = [ [[package]] name = "paste" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4fb1930692d1b6a9cfabdde3d06ea0a7d186518e2f4d67660d8970e2fa647a" +checksum = "0a229b1c58c692edcaa5b9b0948084f130f55d2dcc15b02fcc5340b2b4521476" dependencies = [ "paste-impl", "proc-macro-hack", @@ -4942,14 +4971,14 @@ dependencies = [ [[package]] name = "paste-impl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62486e111e571b1e93b710b61e8f493c0013be39629b714cb166bdb06aa5a8a" +checksum = "2e0bf239e447e67ff6d16a8bb5e4d4bd2343acf5066061c0e8e06ac5ba8ca68c" dependencies = [ "proc-macro-hack", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -4998,35 +5027,35 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.9" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f6a7f5eee6292c559c793430c55c00aea9d3b3d1905e855806ca4d7253426a2" +checksum = "81d480cb4e89522ccda96d0eed9af94180b7a5f93fb28f66e1fd7d68431663d1" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.9" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8988430ce790d8682672117bc06dda364c0be32d3abd738234f19f3240bad99a" +checksum = "a82996f11efccb19b685b14b5df818de31c1edcee3daa256ab5775dd98e72feb" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] name = "pin-project-lite" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" +checksum = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" [[package]] name = "pin-utils" -version = "0.1.0-alpha.4" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" @@ -5048,9 +5077,9 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "plotters" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb" +checksum = "f9b1d9ca091d370ea3a78d5619145d1b59426ab0c9eedbad2514a4cee08bf389" dependencies = [ "js-sys", "num-traits 0.2.11", @@ -5104,14 +5133,14 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e4b9943a2da369aec5e96f7c10ebc74fcf434d39590d974b0a3460e6f67fbb" +checksum = "c55c21c64d0eaa4d7ed885d959ef2d62d9e488c27c0e02d9aa5ce6c877b7d5f8" dependencies = [ "fixed-hash", "impl-codec", "impl-rlp", - "impl-serde 0.3.0", + "impl-serde 0.3.1", "uint", ] @@ -5132,8 +5161,8 @@ checksum = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678" dependencies = [ "proc-macro-error-attr", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "version_check", ] @@ -5144,8 +5173,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "syn-mid", "version_check", ] @@ -5164,18 +5193,18 @@ checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" [[package]] name = "proc-macro2" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" +checksum = "8872cf6f48eee44265156c111456a700ab3483686b3f96df4cf5481c89157319" dependencies = [ "unicode-xid 0.2.0", ] [[package]] name = "procfs" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe50036aa1b71e553a4a0c48ab7baabf8aa8c7a5a61aae06bf38c2eab7430475" +checksum = "c434e93ef69c216e68e4f417c927b4f31502c3560b72cfdb6827e2321c5c6b3e" dependencies = [ "bitflags", "byteorder 1.3.4", @@ -5218,7 +5247,7 @@ checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" dependencies = [ "bytes 0.5.4", "heck", - "itertools", + "itertools 0.8.2", "log", "multimap", "petgraph", @@ -5235,10 +5264,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" dependencies = [ "anyhow", - "itertools", + "itertools 0.8.2", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -5305,9 +5334,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" [[package]] name = "quote" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" +checksum = "42934bc9c8ab0d3b273a16d8551c8f0fcff46be73276ca083ec2414c15c4ba5e" dependencies = [ "proc-macro2", ] @@ -5605,8 +5634,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "602eb59cda66fcb9aec25841fb76bc01d2b34282dcdd705028da297db6f3eec8" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -5622,9 +5651,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.3.6" +version = "1.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3" +checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" dependencies = [ "aho-corasick", "memchr", @@ -5670,13 +5699,13 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.12" +version = "0.16.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba5a8ec64ee89a76c98c549af81ff14813df09c3e6dc4766c3856da48597a0c" +checksum = "703516ae74571f24b465b4a1431e81e2ad51336cb0ded733a55a1aa3eccac196" dependencies = [ "cc", - "lazy_static", "libc", + "once_cell", "spin", "untrusted", "web-sys", @@ -5789,8 +5818,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -5799,16 +5828,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "pin-project", "static_assertions", ] [[package]] name = "ryu" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" +checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" [[package]] name = "safe-mix" @@ -5855,7 +5884,7 @@ dependencies = [ "bytes 0.5.4", "derive_more", "env_logger 0.7.1", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "libp2p", "log", @@ -5882,7 +5911,7 @@ dependencies = [ name = "sc-basic-authorship" version = "0.8.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -5942,8 +5971,8 @@ version = "2.0.0-dev" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -5957,7 +5986,7 @@ dependencies = [ "derive_more", "env_logger 0.7.1", "fdlimit", - "futures 0.3.4", + "futures 0.3.5", "lazy_static", "log", "names", @@ -5984,7 +6013,7 @@ dependencies = [ "substrate-prometheus-endpoint", "tempfile", "time", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] @@ -5993,7 +6022,7 @@ version = "2.0.0-dev" dependencies = [ "derive_more", "fnv", - "futures 0.3.4", + "futures 0.3.5", "hash-db", "hex-literal", "kvdb", @@ -6074,7 +6103,7 @@ version = "0.8.0-dev" dependencies = [ "derive_more", "env_logger 0.7.1", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -6113,7 +6142,7 @@ dependencies = [ "derive_more", "env_logger 0.7.1", "fork-tree", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "log", "merlin", @@ -6161,7 +6190,7 @@ name = "sc-consensus-babe-rpc" version = "0.8.0-dev" dependencies = [ "derive_more", - "futures 0.3.4", + "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6203,7 +6232,7 @@ dependencies = [ "assert_matches", "derive_more", "env_logger 0.7.1", - "futures 0.3.4", + "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6223,7 +6252,7 @@ dependencies = [ "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", "tempfile", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] @@ -6231,7 +6260,7 @@ name = "sc-consensus-pow" version = "0.8.0-dev" dependencies = [ "derive_more", - "futures 0.3.4", + "futures 0.3.5", "log", "parity-scale-codec", "sc-client-api", @@ -6251,7 +6280,7 @@ dependencies = [ name = "sc-consensus-slots" version = "0.8.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -6377,7 +6406,7 @@ dependencies = [ "env_logger 0.7.1", "finality-grandpa", "fork-tree", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -6409,7 +6438,7 @@ dependencies = [ "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tempfile", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] @@ -6418,7 +6447,7 @@ version = "0.8.0-dev" dependencies = [ "derive_more", "finality-grandpa", - "futures 0.3.4", + "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6434,7 +6463,7 @@ name = "sc-informant" version = "0.8.0-dev" dependencies = [ "ansi_term 0.12.1", - "futures 0.3.4", + "futures 0.3.5", "log", "parity-util-mem", "sc-client-api", @@ -6475,7 +6504,7 @@ dependencies = [ "erased-serde", "fnv", "fork-tree", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "futures_codec", "hex", @@ -6525,7 +6554,7 @@ name = "sc-network-gossip" version = "0.8.0-dev" dependencies = [ "async-std", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "libp2p", "log", @@ -6543,7 +6572,7 @@ name = "sc-network-test" version = "0.8.0-dev" dependencies = [ "env_logger 0.7.1", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "libp2p", "log", @@ -6572,9 +6601,9 @@ dependencies = [ "env_logger 0.7.1", "fdlimit", "fnv", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", - "hyper 0.13.4", + "hyper 0.13.5", "hyper-rustls", "log", "num_cpus", @@ -6594,14 +6623,14 @@ dependencies = [ "sp-utils", "substrate-test-runtime-client", "threadpool", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] name = "sc-peerset" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "libp2p", "log", "rand 0.7.3", @@ -6624,7 +6653,7 @@ version = "2.0.0-dev" dependencies = [ "assert_matches", "futures 0.1.29", - "futures 0.3.4", + "futures 0.3.5", "hash-db", "jsonrpc-core", "jsonrpc-pubsub", @@ -6662,7 +6691,7 @@ name = "sc-rpc-api" version = "0.8.0-dev" dependencies = [ "derive_more", - "futures 0.3.4", + "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6714,7 +6743,7 @@ dependencies = [ "derive_more", "exit-future", "futures 0.1.29", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "hash-db", "lazy_static", @@ -6775,7 +6804,7 @@ dependencies = [ "env_logger 0.7.1", "fdlimit", "futures 0.1.29", - "futures 0.3.4", + "futures 0.3.5", "hex-literal", "log", "parity-scale-codec", @@ -6822,7 +6851,7 @@ name = "sc-telemetry" version = "2.0.0-dev" dependencies = [ "bytes 0.5.4", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "libp2p", "log", @@ -6858,9 +6887,9 @@ name = "sc-transaction-graph" version = "2.0.0-dev" dependencies = [ "assert_matches", - "criterion 0.3.1", + "criterion 0.3.2", "derive_more", - "futures 0.3.4", + "futures 0.3.5", "linked-hash-map", "log", "parity-scale-codec", @@ -6882,7 +6911,7 @@ version = "2.0.0-dev" dependencies = [ "assert_matches", "derive_more", - "futures 0.3.4", + "futures 0.3.5", "futures-diagnose", "hex", "intervalier", @@ -6908,9 +6937,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039c25b130bd8c1321ee2d7de7fde2659fa9c2744e4bb29711cfc852ea53cd19" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" dependencies = [ "lazy_static", "winapi 0.3.8", @@ -6957,13 +6986,13 @@ dependencies = [ [[package]] name = "scroll_derive" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28" +checksum = "e367622f934864ffa1c704ba2b82280aab856e3d8213c84c5720257eb34b15b9" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -6978,9 +7007,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "0.4.2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572dfa3a0785509e7a44b5b4bebcf94d41ba34e9ed9eb9df722545c3b3c4144a" +checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" dependencies = [ "bitflags", "core-foundation", @@ -6991,9 +7020,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb15a5fec93b7021b8a9e96009c5d8d51c15673569f7c0f6b7204e5b7b404f" +checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" dependencies = [ "core-foundation-sys", "libc", @@ -7044,29 +7073,29 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.106" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" +checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.106" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" +checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] name = "serde_json" -version = "1.0.51" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9" +checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" dependencies = [ "itoa", "ryu", @@ -7188,8 +7217,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -7246,7 +7275,7 @@ dependencies = [ "base64 0.11.0", "bytes 0.5.4", "flate2", - "futures 0.3.4", + "futures 0.3.5", "http 0.2.1", "httparse", "log", @@ -7290,15 +7319,15 @@ dependencies = [ "blake2-rfc", "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] name = "sp-api-test" version = "2.0.0-dev" dependencies = [ - "criterion 0.3.1", + "criterion 0.3.2", "parity-scale-codec", "rustversion", "sc-block-builder", @@ -7339,7 +7368,7 @@ dependencies = [ name = "sp-arithmetic" version = "2.0.0-dev" dependencies = [ - "criterion 0.3.1", + "criterion 0.3.2", "integer-sqrt", "num-traits 0.2.11", "parity-scale-codec", @@ -7422,7 +7451,7 @@ name = "sp-consensus" version = "0.8.0-dev" dependencies = [ "derive_more", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "libp2p", "log", @@ -7501,12 +7530,12 @@ dependencies = [ "criterion 0.2.11", "derive_more", "ed25519-dalek", - "futures 0.3.4", + "futures 0.3.5", "hash-db", "hash256-std-hasher", "hex", "hex-literal", - "impl-serde 0.3.0", + "impl-serde 0.3.1", "lazy_static", "libsecp256k1", "log", @@ -7550,8 +7579,8 @@ name = "sp-debug-derive" version = "2.0.0-dev" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -7603,7 +7632,7 @@ dependencies = [ name = "sp-io" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "hash-db", "libsecp256k1", "log", @@ -7667,8 +7696,8 @@ version = "2.0.0-dev" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -7740,8 +7769,8 @@ dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -7896,7 +7925,7 @@ name = "sp-transaction-pool" version = "2.0.0-dev" dependencies = [ "derive_more", - "futures 0.3.4", + "futures 0.3.5", "log", "parity-scale-codec", "serde", @@ -7927,7 +7956,7 @@ dependencies = [ name = "sp-utils" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "futures-core", "lazy_static", "prometheus", @@ -8016,9 +8045,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6da2e8d107dfd7b74df5ef4d205c6aebee0706c647f6bc6a2d5789905c00fb" +checksum = "863246aaf5ddd0d6928dfeb1a9ca65f505599e4e1b399935ef7e75107516b4ef" dependencies = [ "clap", "lazy_static", @@ -8027,15 +8056,15 @@ dependencies = [ [[package]] name = "structopt-derive" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a489c87c08fbaf12e386665109dd13470dcc9c4583ea3e10dd2b4523e5ebd9ac" +checksum = "d239ca4b13aee7a2142e6795cbd69e457665ff8037aed33b3effdc430d2f927a" dependencies = [ "heck", "proc-macro-error", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -8055,8 +8084,8 @@ checksum = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" dependencies = [ "heck", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -8070,7 +8099,7 @@ dependencies = [ "hex", "hex-literal", "hyper 0.12.35", - "itertools", + "itertools 0.8.2", "jsonrpc-core-client", "libp2p", "node-primitives", @@ -8110,7 +8139,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "futures 0.1.29", - "futures 0.3.4", + "futures 0.3.5", "futures-timer 3.0.2", "js-sys", "kvdb-web", @@ -8140,14 +8169,14 @@ version = "2.0.0-dev" dependencies = [ "frame-support", "frame-system", - "futures 0.3.4", + "futures 0.3.5", "jsonrpc-client-transports", "jsonrpc-core", "parity-scale-codec", "sc-rpc-api", "serde", "sp-storage", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] @@ -8156,7 +8185,7 @@ version = "2.0.0-dev" dependencies = [ "env_logger 0.7.1", "frame-system-rpc-runtime-api", - "futures 0.3.4", + "futures 0.3.5", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -8180,17 +8209,17 @@ dependencies = [ "async-std", "derive_more", "futures-util", - "hyper 0.13.4", + "hyper 0.13.5", "log", "prometheus", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] name = "substrate-test-client" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "hash-db", "parity-scale-codec", "sc-client-api", @@ -8253,7 +8282,7 @@ dependencies = [ name = "substrate-test-runtime-client" version = "2.0.0-dev" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "parity-scale-codec", "sc-block-builder", "sc-client-api", @@ -8273,7 +8302,7 @@ name = "substrate-test-runtime-transaction-pool" version = "2.0.0-dev" dependencies = [ "derive_more", - "futures 0.3.4", + "futures 0.3.5", "parity-scale-codec", "parking_lot 0.10.2", "sc-transaction-graph", @@ -8295,7 +8324,7 @@ dependencies = [ "build-helper", "cargo_metadata", "fs2", - "itertools", + "itertools 0.8.2", "tempfile", "toml", "walkdir", @@ -8342,7 +8371,7 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli", + "gimli 0.20.0", "log", "more-asserts", "region", @@ -8364,10 +8393,10 @@ checksum = "c77f0ce539b5a09a54dc80a1cf0c7cd7e694df11029354fe50a2d5fe889bdb97" dependencies = [ "anyhow", "cfg-if", - "gimli", + "gimli 0.20.0", "lazy_static", "libc", - "object", + "object 0.18.0", "scroll", "serde", "substrate-wasmtime-runtime", @@ -8420,12 +8449,12 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.17" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" +checksum = "4696caa4048ac7ce2bcd2e484b3cef88c1004e41b8e945a277e2c25dc0b72060" dependencies = [ "proc-macro2", - "quote 1.0.3", + "quote 1.0.5", "unicode-xid 0.2.0", ] @@ -8436,8 +8465,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -8456,16 +8485,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "unicode-xid 0.2.0", ] [[package]] name = "sysinfo" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0338198966bde7feb14b011a33d404a62a6e03b843352c71512a2a002634b7" +checksum = "1cac193374347e7c263c5f547524f36ff8ec6702d56c8799c8331d26dffe8c1e" dependencies = [ "cfg-if", "doc-comment", @@ -8519,8 +8548,8 @@ checksum = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" dependencies = [ "lazy_static", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "version_check", ] @@ -8535,22 +8564,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b3d3d2ff68104100ab257bb6bb0cb26c901abe4bd4ba15961f3bf867924012" +checksum = "467e5ff447618a916519a4e0d62772ab14f434897f3d63f05d8700ef1e9b22c1" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca972988113b7715266f91250ddb98070d033c62a011fa0fcc57434a649310dd" +checksum = "e63c1091225b9834089b429bc4a2e01223470e3183e891582909e9d1c4cb55d9" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -8564,21 +8593,20 @@ dependencies = [ [[package]] name = "threadpool" -version = "1.7.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" dependencies = [ "num_cpus", ] [[package]] name = "time" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" dependencies = [ "libc", - "redox_syscall", "winapi 0.3.8", ] @@ -8618,9 +8646,9 @@ dependencies = [ [[package]] name = "tinytemplate" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" +checksum = "45e4bc5ac99433e0dcb8b9f309dd271a165ae37dde129b9e0ce1bfdd8bfe4891" dependencies = [ "serde", "serde_json", @@ -8652,9 +8680,9 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ef16d072d2b6dc8b4a56c70f5c5ced1a37752116f8e7c1e80c659aa7cb6713" +checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" dependencies = [ "bytes 0.5.4", "fnv", @@ -8755,8 +8783,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -8786,7 +8814,7 @@ checksum = "4adb8b3e5f86b707f1b54e7c15b6de52617a823608ccda98a15d3a24222f265a" dependencies = [ "futures-core", "rustls", - "tokio 0.2.18", + "tokio 0.2.21", "webpki", ] @@ -8898,7 +8926,7 @@ dependencies = [ "futures-sink", "log", "pin-project-lite", - "tokio 0.2.18", + "tokio 0.2.21", ] [[package]] @@ -8933,8 +8961,8 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fbad39da2f9af1cae3016339ad7f2c7a9e870f12e8fd04c4fd7ef35b30c0d2b" dependencies = [ - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", ] [[package]] @@ -9008,9 +9036,9 @@ checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "trybuild" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459186ab1afd6d93bd23c2269125f4f7694f8771fe0e64434b4bdc212b94034d" +checksum = "744665442556a91933cee5e75b0371376eb03498c4d0bfbcebd2a9882b4fb5ef" dependencies = [ "glob 0.3.0", "lazy_static", @@ -9048,9 +9076,9 @@ checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "uint" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" +checksum = "173cd16430c206dc1a430af8a89a0e9c076cf15cb42b4aedb10e8cc8fee73681" dependencies = [ "byteorder 1.3.4", "crunchy", @@ -9123,9 +9151,9 @@ dependencies = [ [[package]] name = "untrusted" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" @@ -9157,9 +9185,9 @@ checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" [[package]] name = "vec_map" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" @@ -9265,16 +9293,16 @@ dependencies = [ "lazy_static", "log", "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7add542ea1ac7fdaa9dc25e031a6af33b7d63376292bd24140c637d00d1c312a" +checksum = "8a369c5e1dfb7569e14d62af4da642a3cbc2f9a3652fe586e26ac22222aa4b04" dependencies = [ "cfg-if", "js-sys", @@ -9288,7 +9316,7 @@ version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" dependencies = [ - "quote 1.0.3", + "quote 1.0.5", "wasm-bindgen-macro-support", ] @@ -9299,8 +9327,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9313,9 +9341,9 @@ checksum = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" [[package]] name = "wasm-bindgen-test" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648da3460c6d2aa04b715a936329e2e311180efe650b2127d6267f4193ccac14" +checksum = "fd8e9dad8040e378f0696b017570c6bc929aac373180e06b3d67ac5059c52da3" dependencies = [ "console_error_panic_hook", "js-sys", @@ -9327,12 +9355,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.10" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2f86cd78a2aa7b1fb4bb6ed854eccb7f9263089c79542dca1576a1518a8467" +checksum = "c358c8d2507c1bae25efa069e62ea907aa28700b25c8c33dafb0b15ba4603627" dependencies = [ "proc-macro2", - "quote 1.0.3", + "quote 1.0.5", ] [[package]] @@ -9352,7 +9380,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "js-sys", "parking_lot 0.9.0", "pin-utils", @@ -9406,7 +9434,7 @@ checksum = "d39ba645aee700b29ff0093028b4123556dd142a74973f04ed6225eedb40e77d" dependencies = [ "anyhow", "faerie", - "gimli", + "gimli 0.20.0", "more-asserts", "target-lexicon", "thiserror", @@ -9421,7 +9449,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed54fd9d64dfeeee7c285fd126174a6b5e6d4efc7e5a1566fdb635e60ff6a74e" dependencies = [ "anyhow", - "base64 0.12.0", + "base64 0.12.1", "bincode", "cranelift-codegen", "cranelift-entity", @@ -9445,27 +9473,27 @@ dependencies = [ [[package]] name = "wast" -version = "13.0.0" +version = "17.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b20abd8b4a26f7e0d4dd5e357e90a3d555ec190e94472c9b2b27c5b9777f9ae" +checksum = "5a0e1c36b928fca33dbaf96235188f5fad22ee87100e26cc606bd0fbabdf1932" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a615830ee3e7200b505c441fec09aac2f114deae69df52f215cb828ba112c4" +checksum = "2b50f9e5e5c81e6fd987ae6997a9f4bbb751df2dec1d8cadb0b5778f1ec13bbe" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.37" +version = "0.3.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6f51648d8c56c366144378a33290049eafdd784071077f6fe37dae64c1c4cb" +checksum = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" dependencies = [ "js-sys", "wasm-bindgen", @@ -9538,9 +9566,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa515c5163a99cc82bab70fd3bfdd36d827be85de63737b40fcef2ce084a436e" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi 0.3.8", ] @@ -9602,7 +9630,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84300bb493cc878f3638b981c62b4632ec1a5c52daaa3036651e8c106d3b55ea" dependencies = [ - "futures 0.3.4", + "futures 0.3.5", "log", "nohash-hasher", "parking_lot 0.10.2", @@ -9626,8 +9654,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" dependencies = [ "proc-macro2", - "quote 1.0.3", - "syn 1.0.17", + "quote 1.0.5", + "syn 1.0.21", "synstructure", ] diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 022baa0f13..3147e79803 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -12,24 +12,19 @@ description = "FRAME pallet staking" targets = ["x86_64-unknown-linux-gnu"] [dependencies] +static_assertions = "1.1.0" serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io", default-features = false } +sp-io ={ version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-dev", features = ["historical"], path = "../session", default-features = false } +pallet-session = { version = "2.0.0-dev", default-features = false, features = ["historical"], path = "../session" } pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -static_assertions = "1.1.0" - -# Optional imports for tesing-utils feature -pallet-indices = { version = "2.0.0-dev", optional = true, path = "../indices", default-features = false } -sp-core = { version = "2.0.0-dev", optional = true, path = "../../primitives/core", default-features = false } -rand = { version = "0.7.3", optional = true, default-features = false } # Optional imports for benchmarking frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } @@ -49,12 +44,6 @@ env_logger = "0.7.1" hex = "0.4" [features] -testing-utils = [ - "std", - "pallet-indices/std", - "sp-core/std", - "rand/std", -] default = ["std"] std = [ "serde", @@ -69,9 +58,8 @@ std = [ "frame-system/std", "pallet-authorship/std", "sp-application-crypto/std", - "sp-core/std", ] runtime-benchmarks = [ - "rand_chacha", "frame-benchmarking", + "rand_chacha", ] diff --git a/frame/staking/fuzzer/Cargo.toml b/frame/staking/fuzzer/Cargo.toml index c717dd8598..44075aa572 100644 --- a/frame/staking/fuzzer/Cargo.toml +++ b/frame/staking/fuzzer/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] honggfuzz = "0.5" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -pallet-staking = { version = "2.0.0-dev", path = "..", features = ["testing-utils"] } +pallet-staking = { version = "2.0.0-dev", path = "..", features = ["runtime-benchmarks"] } pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../reward-curve" } pallet-session = { version = "2.0.0-dev", path = "../../session" } pallet-indices = { version = "2.0.0-dev", path = "../../indices" } diff --git a/frame/staking/fuzzer/src/submit_solution.rs b/frame/staking/fuzzer/src/submit_solution.rs index 067ab0c631..fafd686c9d 100644 --- a/frame/staking/fuzzer/src/submit_solution.rs +++ b/frame/staking/fuzzer/src/submit_solution.rs @@ -16,17 +16,18 @@ // limitations under the License. //! Fuzzing for staking pallet. +//! +//! HFUZZ_RUN_ARGS="-n 8" cargo hfuzz run submit_solution use honggfuzz::fuzz; use mock::Test; -use pallet_staking::testing_utils::{ - USER, get_seq_phragmen_solution, get_weak_solution, setup_chain_stakers, - set_validator_count, signed_account, -}; +use pallet_staking::testing_utils::*; use frame_support::{assert_ok, storage::StorageValue}; +use frame_system::RawOrigin; use sp_runtime::{traits::Dispatchable, DispatchError}; use sp_core::offchain::{testing::TestOffchainExt, OffchainExt}; +use pallet_staking::{EraElectionStatus, ElectionStatus, Module as Staking, Call as StakingCall}; mod mock; @@ -88,47 +89,52 @@ fn main() { ext.execute_with(|| { // initial setup - set_validator_count::(to_elect); - pallet_staking::testing_utils::init_active_era(); - setup_chain_stakers::( + init_active_era(); + assert_ok!(create_validators_with_nominators_for_era::( num_validators, num_nominators, - edge_per_voter, - ); - >::put(pallet_staking::ElectionStatus::Open(1)); + edge_per_voter as usize, + true, + None, + )); + >::put(ElectionStatus::Open(1)); + assert!(>::create_stakers_snapshot().0); + let origin = RawOrigin::Signed(create_funded_user::("fuzzer", 0, 100)); println!("++ Chain setup done."); // stuff to submit - let (winners, compact, score) = match mode { + let (winners, compact, score, size) = match mode { Mode::InitialSubmission => { /* No need to setup anything */ get_seq_phragmen_solution::(do_reduce) }, Mode::StrongerSubmission => { - let (winners, compact, score) = get_weak_solution::(false); + let (winners, compact, score, size) = get_weak_solution::(false); println!("Weak on chain score = {:?}", score); assert_ok!( - >::submit_election_solution( - signed_account::(USER), + >::submit_election_solution( + origin.clone().into(), winners, compact, score, - pallet_staking::testing_utils::active_era::(), + current_era::(), + size, ) ); get_seq_phragmen_solution::(do_reduce) }, Mode::WeakerSubmission => { - let (winners, compact, score) = get_seq_phragmen_solution::(do_reduce); + let (winners, compact, score, size) = get_seq_phragmen_solution::(do_reduce); println!("Strong on chain score = {:?}", score); assert_ok!( - >::submit_election_solution( - signed_account::(USER), + >::submit_election_solution( + origin.clone().into(), winners, compact, score, - pallet_staking::testing_utils::active_era::(), + current_era::(), + size, ) ); get_weak_solution::(false) @@ -138,27 +144,34 @@ fn main() { println!("++ Submission ready. Score = {:?}", score); // must have chosen correct number of winners. - assert_eq!(winners.len() as u32, >::validator_count()); + assert_eq!(winners.len() as u32, >::validator_count()); // final call and origin - let call = pallet_staking::Call::::submit_election_solution( + let call = StakingCall::::submit_election_solution( winners, compact, score, - pallet_staking::testing_utils::active_era::(), + current_era::(), + size, ); - let caller = signed_account::(USER); // actually submit match mode { Mode::WeakerSubmission => { assert_eq!( - call.dispatch(caller.into()).unwrap_err().error, - DispatchError::Module { index: 0, error: 16, message: Some("PhragmenWeakSubmission") }, + call.dispatch(origin.clone().into()).unwrap_err().error, + DispatchError::Module { + index: 0, + error: 16, + message: Some("PhragmenWeakSubmission"), + }, ); }, - // NOTE: so exhaustive pattern doesn't work here.. maybe some rust issue? or due to `#[repr(u32)]`? - Mode::InitialSubmission | Mode::StrongerSubmission => assert!(call.dispatch(caller.into()).is_ok()), + // NOTE: so exhaustive pattern doesn't work here.. maybe some rust issue? + // or due to `#[repr(u32)]`? + Mode::InitialSubmission | Mode::StrongerSubmission => { + assert_ok!(call.dispatch(origin.into())); + } }; }) }); diff --git a/frame/staking/src/benchmarking.rs b/frame/staking/src/benchmarking.rs index cd6d0badd0..d3723dce1c 100644 --- a/frame/staking/src/benchmarking.rs +++ b/frame/staking/src/benchmarking.rs @@ -18,53 +18,17 @@ //! Staking pallet benchmarking. use super::*; - -use rand_chacha::{rand_core::{RngCore, SeedableRng}, ChaChaRng}; - -use sp_runtime::traits::{Dispatchable, One}; -use sp_io::hashing::blake2_256; - -use frame_system::RawOrigin; -use frame_benchmarking::{benchmarks, account}; - use crate::Module as Staking; +use testing_utils::*; +use sp_runtime::{traits::{Dispatchable, One}}; +use frame_system::RawOrigin; +pub use frame_benchmarking::{benchmarks, account}; const SEED: u32 = 0; const MAX_SPANS: u32 = 100; const MAX_VALIDATORS: u32 = 1000; const MAX_SLASHES: u32 = 1000; -fn create_funded_user(string: &'static str, n: u32) -> T::AccountId { - let user = account(string, n, SEED); - let balance = T::Currency::minimum_balance() * 100.into(); - T::Currency::make_free_balance_be(&user, balance); - user -} - -pub fn create_stash_controller(n: u32) -> Result<(T::AccountId, T::AccountId), &'static str> { - let stash = create_funded_user::("stash", n); - let controller = create_funded_user::("controller", n); - let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); - let reward_destination = RewardDestination::Staked; - let amount = T::Currency::minimum_balance() * 10.into(); - Staking::::bond(RawOrigin::Signed(stash.clone()).into(), controller_lookup, amount, reward_destination)?; - return Ok((stash, controller)) -} - -fn create_validators(max: u32) -> Result::Source>, &'static str> { - let mut validators: Vec<::Source> = Vec::with_capacity(max as usize); - for i in 0 .. max { - let (stash, controller) = create_stash_controller::(i)?; - let validator_prefs = ValidatorPrefs { - commission: Perbill::from_percent(50), - }; - Staking::::validate(RawOrigin::Signed(controller).into(), validator_prefs)?; - let stash_lookup: ::Source = T::Lookup::unlookup(stash); - validators.push(stash_lookup); - } - Ok(validators) -} - // Add slashing spans to a user account. Not relevant for actual use, only to benchmark // read and write operations. fn add_slashing_spans(who: &T::AccountId, spans: u32) { @@ -81,51 +45,15 @@ fn add_slashing_spans(who: &T::AccountId, spans: u32) { SlashingSpans::::insert(who, slashing_spans); } -// This function generates v validators and n nominators who are randomly nominating up to MAX_NOMINATIONS. -pub fn create_validators_with_nominators_for_era(v: u32, n: u32) -> Result<(), &'static str> { - let mut validators: Vec<::Source> = Vec::with_capacity(v as usize); - let mut rng = ChaChaRng::from_seed(SEED.using_encoded(blake2_256)); - - // Create v validators - for i in 0 .. v { - let (v_stash, v_controller) = create_stash_controller::(i)?; - let validator_prefs = ValidatorPrefs { - commission: Perbill::from_percent(50), - }; - Staking::::validate(RawOrigin::Signed(v_controller.clone()).into(), validator_prefs)?; - let stash_lookup: ::Source = T::Lookup::unlookup(v_stash.clone()); - validators.push(stash_lookup.clone()); - } - - // Create n nominators - for j in 0 .. n { - let (_n_stash, n_controller) = create_stash_controller::(u32::max_value() - j)?; - - // Have them randomly validate - let mut available_validators = validators.clone(); - let mut selected_validators: Vec<::Source> = Vec::with_capacity(MAX_NOMINATIONS); - for _ in 0 .. v.min(MAX_NOMINATIONS as u32) { - let selected = rng.next_u32() as usize % available_validators.len(); - let validator = available_validators.remove(selected); - selected_validators.push(validator); - } - Staking::::nominate(RawOrigin::Signed(n_controller.clone()).into(), selected_validators)?; - } - - ValidatorCount::put(v); - - Ok(()) -} - -// This function generates one validator being nominated by n nominators, and returns -//the validator stash account. It also starts an era and creates pending payouts. +// This function generates one validator being nominated by n nominators, and returns the validator +// stash account. It also starts an era and creates pending payouts. pub fn create_validator_with_nominators(n: u32, upper_bound: u32) -> Result { let mut points_total = 0; let mut points_individual = Vec::new(); MinimumValidatorCount::put(0); - let (v_stash, v_controller) = create_stash_controller::(0)?; + let (v_stash, v_controller) = create_stash_controller::(0, 100)?; let validator_prefs = ValidatorPrefs { commission: Perbill::from_percent(50), }; @@ -137,7 +65,7 @@ pub fn create_validator_with_nominators(n: u32, upper_bound: u32) -> R // Give the validator n nominators, but keep total users in the system the same. for i in 0 .. upper_bound { - let (_n_stash, n_controller) = create_stash_controller::(u32::max_value() - i)?; + let (_n_stash, n_controller) = create_stash_controller::(u32::max_value() - i, 100)?; if i < n { Staking::::nominate(RawOrigin::Signed(n_controller.clone()).into(), vec![stash_lookup.clone()])?; } @@ -174,8 +102,8 @@ benchmarks! { bond { let u in ...; - let stash = create_funded_user::("stash",u); - let controller = create_funded_user::("controller", u); + let stash = create_funded_user::("stash", u, 100); + let controller = create_funded_user::("controller", u, 100); let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); let reward_destination = RewardDestination::Staked; let amount = T::Currency::minimum_balance() * 10.into(); @@ -187,7 +115,7 @@ benchmarks! { bond_extra { let u in ...; - let (stash, controller) = create_stash_controller::(u)?; + let (stash, controller) = create_stash_controller::(u, 100)?; let max_additional = T::Currency::minimum_balance() * 10.into(); let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; let original_bonded: BalanceOf = ledger.active; @@ -200,7 +128,7 @@ benchmarks! { unbond { let u in ...; - let (_, controller) = create_stash_controller::(u)?; + let (_, controller) = create_stash_controller::(u, 100)?; let amount = T::Currency::minimum_balance() * 10.into(); let ledger = Ledger::::get(&controller).ok_or("ledger not created before")?; let original_bonded: BalanceOf = ledger.active; @@ -215,7 +143,7 @@ benchmarks! { withdraw_unbonded_update { // Slashing Spans let s in 0 .. MAX_SPANS; - let (stash, controller) = create_stash_controller::(0)?; + let (stash, controller) = create_stash_controller::(0, 100)?; add_slashing_spans::(&stash, s); let amount = T::Currency::minimum_balance() * 5.into(); // Half of total Staking::::unbond(RawOrigin::Signed(controller.clone()).into(), amount)?; @@ -233,7 +161,7 @@ benchmarks! { withdraw_unbonded_kill { // Slashing Spans let s in 0 .. MAX_SPANS; - let (stash, controller) = create_stash_controller::(0)?; + let (stash, controller) = create_stash_controller::(0, 100)?; add_slashing_spans::(&stash, s); let amount = T::Currency::minimum_balance() * 10.into(); Staking::::unbond(RawOrigin::Signed(controller.clone()).into(), amount)?; @@ -247,7 +175,7 @@ benchmarks! { validate { let u in ...; - let (stash, controller) = create_stash_controller::(u)?; + let (stash, controller) = create_stash_controller::(u, 100)?; let prefs = ValidatorPrefs::default(); }: _(RawOrigin::Signed(controller), prefs) verify { @@ -257,8 +185,8 @@ benchmarks! { // Worst case scenario, MAX_NOMINATIONS nominate { let n in 1 .. MAX_NOMINATIONS as u32; - let (stash, controller) = create_stash_controller::(n + 1)?; - let validators = create_validators::(n)?; + let (stash, controller) = create_stash_controller::(n + 1, 100)?; + let validators = create_validators::(n, 100)?; }: _(RawOrigin::Signed(controller), validators) verify { assert!(Nominators::::contains_key(stash)); @@ -266,12 +194,12 @@ benchmarks! { chill { let u in ...; - let (_, controller) = create_stash_controller::(u)?; + let (_, controller) = create_stash_controller::(u, 100)?; }: _(RawOrigin::Signed(controller)) set_payee { let u in ...; - let (stash, controller) = create_stash_controller::(u)?; + let (stash, controller) = create_stash_controller::(u, 100)?; assert_eq!(Payee::::get(&stash), RewardDestination::Staked); }: _(RawOrigin::Signed(controller), RewardDestination::Controller) verify { @@ -280,8 +208,8 @@ benchmarks! { set_controller { let u in ...; - let (stash, _) = create_stash_controller::(u)?; - let new_controller = create_funded_user::("new_controller", u); + let (stash, _) = create_stash_controller::(u, 100)?; + let new_controller = create_funded_user::("new_controller", u, 100); let new_controller_lookup = T::Lookup::unlookup(new_controller.clone()); }: _(RawOrigin::Signed(stash), new_controller_lookup) verify { @@ -319,7 +247,7 @@ benchmarks! { force_unstake { // Slashing Spans let s in 0 .. MAX_SPANS; - let (stash, controller) = create_stash_controller::(0)?; + let (stash, controller) = create_stash_controller::(0, 100)?; add_slashing_spans::(&stash, s); }: _(RawOrigin::Root, stash, s) verify { @@ -356,7 +284,7 @@ benchmarks! { rebond { let l in 1 .. MAX_UNLOCKING_CHUNKS as u32; - let (_, controller) = create_stash_controller::(u)?; + let (_, controller) = create_stash_controller::(u, 100)?; let mut staking_ledger = Ledger::::get(controller.clone()).unwrap(); let unlock_chunk = UnlockChunk::> { value: 1.into(), @@ -394,7 +322,7 @@ benchmarks! { reap_stash { let s in 1 .. MAX_SPANS; - let (stash, controller) = create_stash_controller::(0)?; + let (stash, controller) = create_stash_controller::(0, 100)?; add_slashing_spans::(&stash, s); T::Currency::make_free_balance_be(&stash, 0.into()); }: _(RawOrigin::Signed(controller), stash.clone(), s) @@ -406,7 +334,7 @@ benchmarks! { let v in 1 .. 10; let n in 1 .. 100; MinimumValidatorCount::put(0); - create_validators_with_nominators_for_era::(v, n)?; + create_validators_with_nominators_for_era::(v, n, MAX_NOMINATIONS, false, None)?; let session_index = SessionIndex::one(); }: { let validators = Staking::::new_era(session_index).ok_or("`new_era` failed")?; @@ -415,7 +343,7 @@ benchmarks! { do_slash { let l in 1 .. MAX_UNLOCKING_CHUNKS as u32; - let (stash, controller) = create_stash_controller::(0)?; + let (stash, controller) = create_stash_controller::(0, 100)?; let mut staking_ledger = Ledger::::get(controller.clone()).unwrap(); let unlock_chunk = UnlockChunk::> { value: 1.into(), @@ -443,7 +371,7 @@ benchmarks! { let v in 1 .. 10; let n in 1 .. 100; MinimumValidatorCount::put(0); - create_validators_with_nominators_for_era::(v, n)?; + create_validators_with_nominators_for_era::(v, n, MAX_NOMINATIONS, false, None)?; // Start a new Era let new_validators = Staking::::new_era(SessionIndex::one()).unwrap(); assert!(new_validators.len() == v as usize); @@ -477,6 +405,198 @@ benchmarks! { call.dispatch(RawOrigin::Signed(caller.clone()).into())?; } } + + // This benchmark create `v` validators intent, `n` nominators intent, each nominator nominate + // MAX_NOMINATIONS in the set of the first `w` validators. + // It builds a solution with `w` winners composed of nominated validators randomly nominated, + // `a` assignment with MAX_NOMINATIONS. + submit_solution_initial { + // number of validator intent + let v in 1000 .. 2000; + // number of nominator intent + let n in 1000 .. 2000; + // number of assignments. Basically, number of active nominators. + let a in 200 .. 500; + // number of winners, also ValidatorCount + let w in 16 .. 100; + + ensure!(w as usize >= MAX_NOMINATIONS, "doesn't support lower value"); + + let winners = create_validators_with_nominators_for_era::( + v, + n, + MAX_NOMINATIONS, + false, + Some(w), + )?; + + // needed for the solution to be generates. + assert!(>::create_stakers_snapshot().0); + + // set number of winners + ValidatorCount::put(w); + + // create a assignments in total for the w winners. + let (winners, assignments) = create_assignments_for_offchain::(a, winners)?; + + let ( + winners, + compact, + score, + size + ) = offchain_election::prepare_submission::(assignments, winners, false).unwrap(); + + // needed for the solution to be accepted + >::put(ElectionStatus::Open(T::BlockNumber::from(1u32))); + + let era = >::current_era().unwrap_or(0); + let caller: T::AccountId = account("caller", n, SEED); + }: { + let result = >::submit_election_solution( + RawOrigin::Signed(caller.clone()).into(), + winners, + compact, + score.clone(), + era, + size, + ); + assert!(result.is_ok()); + } + verify { + // new solution has been accepted. + assert_eq!(>::queued_score().unwrap(), score); + } + + // same as submit_solution_initial but we place a very weak solution on chian first. + submit_solution_better { + // number of validator intent + let v in 1000 .. 2000; + // number of nominator intent + let n in 1000 .. 2000; + // number of assignments. Basically, number of active nominators. + let a in 200 .. 500; + // number of winners, also ValidatorCount + let w in 16 .. 100; + + ensure!(w as usize >= MAX_NOMINATIONS, "doesn't support lower value"); + + let winners = create_validators_with_nominators_for_era::( + v, + n, + MAX_NOMINATIONS, + false, + Some(w), + )?; + + // needed for the solution to be generates. + assert!(>::create_stakers_snapshot().0); + + // set number of winners + ValidatorCount::put(w); + + // create a assignments in total for the w winners. + let (winners, assignments) = create_assignments_for_offchain::(a, winners)?; + + let single_winner = winners[0].0.clone(); + + let ( + winners, + compact, + score, + size + ) = offchain_election::prepare_submission::(assignments, winners, false).unwrap(); + + // needed for the solution to be accepted + >::put(ElectionStatus::Open(T::BlockNumber::from(1u32))); + + let era = >::current_era().unwrap_or(0); + let caller: T::AccountId = account("caller", n, SEED); + + // submit a very bad solution on-chain + { + // this is needed to fool the chain to accept this solution. + ValidatorCount::put(1); + let (winners, compact, score, size) = get_single_winner_solution::(single_winner)?; + assert!( + >::submit_election_solution( + RawOrigin::Signed(caller.clone()).into(), + winners, + compact, + score.clone(), + era, + size, + ).is_ok()); + + // new solution has been accepted. + assert_eq!(>::queued_score().unwrap(), score); + ValidatorCount::put(w); + } + }: { + let result = >::submit_election_solution( + RawOrigin::Signed(caller.clone()).into(), + winners, + compact, + score.clone(), + era, + size, + ); + assert!(result.is_ok()); + } + verify { + // new solution has been accepted. + assert_eq!(>::queued_score().unwrap(), score); + } + + // This will be early rejected based on the score. + submit_solution_weaker { + // number of validator intent + let v in 1000 .. 2000; + // number of nominator intent + let n in 1000 .. 2000; + + MinimumValidatorCount::put(0); + create_validators_with_nominators_for_era::(v, n, MAX_NOMINATIONS, false, None)?; + + // needed for the solution to be generates. + assert!(>::create_stakers_snapshot().0); + + // needed for the solution to be accepted + >::put(ElectionStatus::Open(T::BlockNumber::from(1u32))); + let caller: T::AccountId = account("caller", n, SEED); + let era = >::current_era().unwrap_or(0); + + // submit a seq-phragmen with all the good stuff on chain + { + let (winners, compact, score, size) = get_seq_phragmen_solution::(true); + assert!( + >::submit_election_solution( + RawOrigin::Signed(caller.clone()).into(), + winners, + compact, + score.clone(), + era, + size, + ).is_ok() + ); + + // new solution has been accepted. + assert_eq!(>::queued_score().unwrap(), score); + } + + // prepare a bad solution. This will be very early rejected. + let (winners, compact, score, size) = get_weak_solution::(true); + }: { + assert!( + >::submit_election_solution( + RawOrigin::Signed(caller.clone()).into(), + winners, + compact, + score.clone(), + era, + size, + ).is_err() + ); + } } #[cfg(test)] @@ -491,7 +611,8 @@ mod tests { let v = 10; let n = 100; - create_validators_with_nominators_for_era::(v,n).unwrap(); + create_validators_with_nominators_for_era::(v, n, MAX_NOMINATIONS, false, None) + .unwrap(); let count_validators = Validators::::iter().count(); let count_nominators = Nominators::::iter().count(); @@ -595,6 +716,18 @@ mod tests { assert_ok!(test_benchmark_new_era::()); assert_ok!(test_benchmark_do_slash::()); assert_ok!(test_benchmark_payout_all::()); + // only run one of them to same time on the CI. ignore the other two. + assert_ok!(test_benchmark_submit_solution_initial::()); }); } + + #[test] + #[ignore] + fn test_benchmarks_offchain() { + ExtBuilder::default().has_stakers(false).build().execute_with(|| { + assert_ok!(test_benchmark_submit_solution_better::()); + assert_ok!(test_benchmark_submit_solution_weaker::()); + }); + } + } diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index bb9664bb2e..526d094eac 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -272,7 +272,7 @@ mod mock; #[cfg(test)] mod tests; -#[cfg(feature = "testing-utils")] +#[cfg(any(feature = "runtime-benchmarks", test))] pub mod testing_utils; #[cfg(any(feature = "runtime-benchmarks", test))] pub mod benchmarking; @@ -293,7 +293,7 @@ use frame_support::{ decl_module, decl_event, decl_storage, ensure, decl_error, debug, weights::{Weight, constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS}}, storage::IterableStorageMap, - dispatch::{IsSubType, DispatchResult, DispatchResultWithPostInfo}, + dispatch::{IsSubType, DispatchResult, DispatchResultWithPostInfo, WithPostDispatchInfo}, traits::{ Currency, LockIdentifier, LockableCurrency, WithdrawReasons, OnUnbalanced, Imbalance, Get, UnixTime, EstimateNextNewSession, EnsureOrigin, @@ -680,6 +680,22 @@ pub enum ElectionStatus { Open(BlockNumber), } +/// Some indications about the size of the election. This must be submitted with the solution. +/// +/// Note that these values must reflect the __total__ number, not only those that are present in the +/// solution. In short, these should be the same size as the size of the values dumped in +/// `SnapshotValidators` and `SnapshotNominators`. +#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, Default)] +pub struct ElectionSize { + /// Number of validators in the snapshot of the current election round. + #[codec(compact)] + pub validators: ValidatorIndex, + /// Number of nominators in the snapshot of the current election round. + #[codec(compact)] + pub nominators: NominatorIndex, +} + + impl ElectionStatus { fn is_open_at(&self, n: BlockNumber) -> bool { *self == Self::Open(n) @@ -743,6 +759,72 @@ impl SessionInterface<::AccountId> for T whe } } +pub mod weight { + use super::*; + + /// All weight notes are pertaining to the case of a better solution, in which we execute + /// the longest code path. + /// Weight: 0 + (0.63 μs * v) + (0.36 μs * n) + (96.53 μs * a ) + (8 μs * w ) with: + /// * v validators in snapshot validators, + /// * n nominators in snapshot nominators, + /// * a assignment in the submitted solution + /// * w winners in the submitted solution + /// + /// State reads: + /// - Initial checks: + /// - ElectionState, CurrentEra, QueuedScore + /// - SnapshotValidators.len() + SnapShotNominators.len() + /// - ValidatorCount + /// - SnapshotValidators + /// - SnapshotNominators + /// - Iterate over nominators: + /// - compact.len() * Nominators(who) + /// - (non_self_vote_edges) * SlashingSpans + /// - For `assignment_ratio_to_staked`: Basically read the staked value of each stash. + /// - (winners.len() + compact.len()) * (Ledger + Bonded) + /// - TotalIssuance (read a gzillion times potentially, but well it is cached.) + /// - State writes: + /// - QueuedElected, QueuedScore + pub fn weight_for_submit_solution( + winners: &Vec, + compact: &CompactAssignments, + size: &ElectionSize, + ) -> Weight { + (630 * WEIGHT_PER_NANOS).saturating_mul(size.validators as Weight) + .saturating_add((360 * WEIGHT_PER_NANOS).saturating_mul(size.nominators as Weight)) + .saturating_add((96 * WEIGHT_PER_MICROS).saturating_mul(compact.len() as Weight)) + .saturating_add((8 * WEIGHT_PER_MICROS).saturating_mul(winners.len() as Weight)) + // Initial checks + .saturating_add(T::DbWeight::get().reads(8)) + // Nominators + .saturating_add(T::DbWeight::get().reads(compact.len() as Weight)) + // SlashingSpans (upper bound for invalid solution) + .saturating_add(T::DbWeight::get().reads(compact.edge_count() as Weight)) + // `assignment_ratio_to_staked` + .saturating_add(T::DbWeight::get().reads(2 * ((winners.len() + compact.len()) as Weight))) + .saturating_add(T::DbWeight::get().reads(1)) + // write queued score and elected + .saturating_add(T::DbWeight::get().writes(2)) + } + + /// Weight of `submit_solution` in case of a correct submission. + /// + /// refund: we charged compact.len() * read(1) for SlashingSpans. A valid solution only reads + /// winners.len(). + pub fn weight_for_correct_submit_solution( + winners: &Vec, + compact: &CompactAssignments, + size: &ElectionSize, + ) -> Weight { + // NOTE: for consistency, we re-compute the original weight to maintain their relation and + // prevent any foot-guns. + let original_weight = weight_for_submit_solution::(winners, compact, size); + original_weight + .saturating_sub(T::DbWeight::get().reads(compact.edge_count() as Weight)) + .saturating_add(T::DbWeight::get().reads(winners.len() as Weight)) + } +} + pub trait Trait: frame_system::Trait + SendTransactionTypes> { /// The staking balance. type Currency: LockableCurrency; @@ -1163,6 +1245,8 @@ decl_error! { PhragmenBogusEdge, /// The claimed score does not match with the one computed from the data. PhragmenBogusScore, + /// The election size is invalid. + PhragmenBogusElectionSize, /// The call is not allowed at the given time due to restrictions of election period. CallNotAllowed, /// Incorrect previous history depth input provided. @@ -2063,51 +2147,26 @@ decl_module! { /// minimized (to ensure less variance) /// /// # - /// E: number of edges. m: size of winner committee. n: number of nominators. d: edge degree - /// (16 for now) v: number of on-chain validator candidates. - /// - /// NOTE: given a solution which is reduced, we can enable a new check the ensure `|E| < n + - /// m`. We don't do this _yet_, but our offchain worker code executes it nonetheless. - /// - /// major steps (all done in `check_and_replace_solution`): - /// - /// - Storage: O(1) read `ElectionStatus`. - /// - Storage: O(1) read `PhragmenScore`. - /// - Storage: O(1) read `ValidatorCount`. - /// - Storage: O(1) length read from `SnapshotValidators`. - /// - /// - Storage: O(v) reads of `AccountId` to fetch `snapshot_validators`. - /// - Memory: O(m) iterations to map winner index to validator id. - /// - Storage: O(n) reads `AccountId` to fetch `snapshot_nominators`. - /// - Memory: O(n + m) reads to map index to `AccountId` for un-compact. - /// - /// - Storage: O(e) accountid reads from `Nomination` to read correct nominations. - /// - Storage: O(e) calls into `slashable_balance_of_vote_weight` to convert ratio to staked. - /// - /// - Memory: build_support_map. O(e). - /// - Memory: evaluate_support: O(E). - /// - /// - Storage: O(e) writes to `QueuedElected`. - /// - Storage: O(1) write to `QueuedScore` - /// - /// The weight of this call is 1/10th of the blocks total weight. + /// See `crate::weight` module. /// # - #[weight = 100_000_000_000] + #[weight = weight::weight_for_submit_solution::(winners, compact, size)] pub fn submit_election_solution( origin, winners: Vec, - compact_assignments: CompactAssignments, + compact: CompactAssignments, score: PhragmenScore, era: EraIndex, - ) { + size: ElectionSize, + ) -> DispatchResultWithPostInfo { let _who = ensure_signed(origin)?; Self::check_and_replace_solution( winners, - compact_assignments, + compact, ElectionCompute::Signed, score, era, - )? + size, + ) } /// Unsigned version of `submit_election_solution`. @@ -2115,22 +2174,28 @@ decl_module! { /// Note that this must pass the [`ValidateUnsigned`] check which only allows transactions /// from the local node to be included. In other words, only the block author can include a /// transaction in the block. - #[weight = 100_000_000_000] + /// + /// # + /// See `crate::weight` module. + /// # + #[weight = weight::weight_for_submit_solution::(winners, compact, size)] pub fn submit_election_solution_unsigned( origin, winners: Vec, - compact_assignments: CompactAssignments, + compact: CompactAssignments, score: PhragmenScore, era: EraIndex, - ) { + size: ElectionSize, + ) -> DispatchResultWithPostInfo { ensure_none(origin)?; Self::check_and_replace_solution( winners, - compact_assignments, + compact, ElectionCompute::Unsigned, score, era, - )? + size, + ) // TODO: instead of returning an error, panic. This makes the entire produced block // invalid. // This ensures that block authors will not ever try and submit a solution which is not @@ -2142,6 +2207,7 @@ decl_module! { impl Module { /// The total balance that can be slashed from a stash account as of right now. pub fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf { + // Weight note: consider making the stake accessible through stash. Self::bonded(stash).and_then(Self::ledger).map(|l| l.active).unwrap_or_default() } @@ -2156,7 +2222,7 @@ impl Module { /// /// This data is used to efficiently evaluate election results. returns `true` if the operation /// is successful. - fn create_stakers_snapshot() -> (bool, Weight) { + pub fn create_stakers_snapshot() -> (bool, Weight) { let mut consumed_weight = 0; let mut add_db_reads_writes = |reads, writes| { consumed_weight += T::DbWeight::get().reads_writes(reads, writes); @@ -2518,19 +2584,24 @@ impl Module { } /// Basic and cheap checks that we perform in validate unsigned, and in the execution. - pub fn pre_dispatch_checks(score: PhragmenScore, era: EraIndex) -> Result<(), Error> { + /// + /// State reads: ElectionState, CurrentEr, QueuedScore. + /// + /// This function does weight refund in case of errors, which is based upon the fact that it is + /// called at the very beginning of the call site's function. + pub fn pre_dispatch_checks(score: PhragmenScore, era: EraIndex) -> DispatchResultWithPostInfo { // discard solutions that are not in-time // check window open ensure!( Self::era_election_status().is_open(), - Error::::PhragmenEarlySubmission, + Error::::PhragmenEarlySubmission.with_weight(T::DbWeight::get().reads(1)), ); // check current era. if let Some(current_era) = Self::current_era() { ensure!( current_era == era, - Error::::PhragmenEarlySubmission, + Error::::PhragmenEarlySubmission.with_weight(T::DbWeight::get().reads(2)), ) } @@ -2538,11 +2609,11 @@ impl Module { if let Some(queued_score) = Self::queued_score() { ensure!( is_score_better(queued_score, score), - Error::::PhragmenWeakSubmission, + Error::::PhragmenWeakSubmission.with_weight(T::DbWeight::get().reads(3)), ) } - Ok(()) + Ok(None.into()) } /// Checks a given solution and if correct and improved, writes it on chain as the queued result @@ -2553,21 +2624,46 @@ impl Module { compute: ElectionCompute, claimed_score: PhragmenScore, era: EraIndex, - ) -> Result<(), Error> { + election_size: ElectionSize, + ) -> DispatchResultWithPostInfo { // Do the basic checks. era, claimed score and window open. Self::pre_dispatch_checks(claimed_score, era)?; + // the weight that we will refund in case of a correct submission. We compute this now + // because the data needed for it will be consumed further down. + let adjusted_weight = weight::weight_for_correct_submit_solution::( + &winners, + &compact_assignments, + &election_size, + ); // Check that the number of presented winners is sane. Most often we have more candidates - // that we need. Then it should be Self::validator_count(). Else it should be all the + // than we need. Then it should be `Self::validator_count()`. Else it should be all the // candidates. - let snapshot_length = >::decode_len() + let snapshot_validators_length = >::decode_len() + .map(|l| l as u32) .ok_or_else(|| Error::::SnapshotUnavailable)?; + // size of the solution must be correct. + ensure!( + snapshot_validators_length == u32::from(election_size.validators), + Error::::PhragmenBogusElectionSize, + ); + // check the winner length only here and when we know the length of the snapshot validators // length. - let desired_winners = Self::validator_count().min(snapshot_length as u32); + let desired_winners = Self::validator_count().min(snapshot_validators_length); ensure!(winners.len() as u32 == desired_winners, Error::::PhragmenBogusWinnerCount); + let snapshot_nominators_len = >::decode_len() + .map(|l| l as u32) + .ok_or_else(|| Error::::SnapshotUnavailable)?; + + // rest of the size of the solution must be correct. + ensure!( + snapshot_nominators_len == election_size.nominators, + Error::::PhragmenBogusElectionSize, + ); + // decode snapshot validators. let snapshot_validators = Self::snapshot_validators() .ok_or(Error::::SnapshotUnavailable)?; @@ -2581,7 +2677,7 @@ impl Module { }).collect::, Error>>()?; // decode the rest of the snapshot. - let snapshot_nominators = >::snapshot_nominators() + let snapshot_nominators = Self::snapshot_nominators() .ok_or(Error::::SnapshotUnavailable)?; // helpers @@ -2615,7 +2711,7 @@ impl Module { // have bigger problems. log!(error, "💸 detected an error in the staking locking and snapshot."); // abort. - return Err(Error::::PhragmenBogusNominator); + return Err(Error::::PhragmenBogusNominator.into()); } if !is_validator { @@ -2632,14 +2728,14 @@ impl Module { // each target in the provided distribution must be actually nominated by the // nominator after the last non-zero slash. if nomination.targets.iter().find(|&tt| tt == t).is_none() { - return Err(Error::::PhragmenBogusNomination); + return Err(Error::::PhragmenBogusNomination.into()); } if ::SlashingSpans::get(&t).map_or( false, |spans| nomination.submitted_in < spans.last_nonzero_slash(), ) { - return Err(Error::::PhragmenSlashedNomination); + return Err(Error::::PhragmenSlashedNomination.into()); } } } else { @@ -2679,8 +2775,9 @@ impl Module { let exposures = Self::collect_exposure(supports); log!( info, - "💸 A better solution (with compute {:?}) has been validated and stored on chain.", + "💸 A better solution (with compute {:?} and score {:?}) has been validated and stored on chain.", compute, + submitted_score, ); // write new results. @@ -2691,8 +2788,7 @@ impl Module { }); QueuedScore::put(submitted_score); - Ok(()) - + Ok(Some(adjusted_weight).into()) } /// Start a session potentially starting an era. @@ -2996,7 +3092,7 @@ impl Module { supports.into_iter().map(|(validator, support)| { // build `struct exposure` from `support` - let mut others = Vec::new(); + let mut others = Vec::with_capacity(support.voters.len()); let mut own: BalanceOf = Zero::zero(); let mut total: BalanceOf = Zero::zero(); support.voters @@ -3381,12 +3477,6 @@ impl ReportOffence } } -impl From> for InvalidTransaction { - fn from(e: Error) -> Self { - InvalidTransaction::Custom(e.as_u8()) - } -} - #[allow(deprecated)] impl frame_support::unsigned::ValidateUnsigned for Module { type Call = Call; @@ -3396,8 +3486,10 @@ impl frame_support::unsigned::ValidateUnsigned for Module { _, score, era, + _, ) = call { use offchain_election::DEFAULT_LONGEVITY; + use sp_runtime::DispatchError; // discard solution not coming from the local OCW. match source { @@ -3408,9 +3500,18 @@ impl frame_support::unsigned::ValidateUnsigned for Module { } } - if let Err(e) = Self::pre_dispatch_checks(*score, *era) { - log!(debug, "validate unsigned pre dispatch checks failed due to {:?}.", e); - return InvalidTransaction::from(e).into(); + if let Err(error_with_post_info) = Self::pre_dispatch_checks(*score, *era) { + let error = error_with_post_info.error; + let error_number = match error { + DispatchError::Module { error, ..} => error, + _ => 0, + }; + log!( + debug, + "validate unsigned pre dispatch checks failed due to module error #{:?}.", + error, + ); + return InvalidTransaction::Custom(error_number).into(); } log!(debug, "validateUnsigned succeeded for a solution at era {}.", era); diff --git a/frame/staking/src/offchain_election.rs b/frame/staking/src/offchain_election.rs index 4e32d75f21..d93b5b2b27 100644 --- a/frame/staking/src/offchain_election.rs +++ b/frame/staking/src/offchain_election.rs @@ -20,6 +20,7 @@ use codec::Decode; use crate::{ Call, CompactAssignments, Module, NominatorIndex, OffchainAccuracy, Trait, ValidatorIndex, + ElectionSize, }; use frame_system::offchain::SubmitTransaction; use sp_phragmen::{ @@ -113,7 +114,7 @@ pub(crate) fn compute_offchain_election() -> Result<(), OffchainElecti .ok_or(OffchainElectionError::ElectionFailed)?; // process and prepare it for submission. - let (winners, compact, score) = prepare_submission::(assignments, winners, true)?; + let (winners, compact, score, size) = prepare_submission::(assignments, winners, true)?; // defensive-only: current era can never be none except genesis. let current_era = >::current_era().unwrap_or_default(); @@ -124,12 +125,14 @@ pub(crate) fn compute_offchain_election() -> Result<(), OffchainElecti compact, score, current_era, + size, ).into(); SubmitTransaction::>::submit_unsigned_transaction(call) .map_err(|_| OffchainElectionError::PoolSubmissionFailed) } + /// Takes a phragmen result and spits out some data that can be submitted to the chain. /// /// This does a lot of stuff; read the inline comments. @@ -137,7 +140,12 @@ pub fn prepare_submission( assignments: Vec>, winners: Vec<(T::AccountId, ExtendedBalance)>, do_reduce: bool, -) -> Result<(Vec, CompactAssignments, PhragmenScore), OffchainElectionError> where +) -> Result<( + Vec, + CompactAssignments, + PhragmenScore, + ElectionSize, +), OffchainElectionError> where ExtendedBalance: From<::Inner>, { // make sure that the snapshot is available. @@ -235,6 +243,12 @@ pub fn prepare_submission( } } + // both conversions are safe; snapshots are not created if they exceed. + let size = ElectionSize { + validators: snapshot_validators.len() as ValidatorIndex, + nominators: snapshot_nominators.len() as NominatorIndex, + }; + debug::native::debug!( target: "staking", "prepared solution after {} equalization iterations with score {:?}", @@ -242,5 +256,5 @@ pub fn prepare_submission( score, ); - Ok((winners_indexed, compact, score)) + Ok((winners_indexed, compact, score, size)) } diff --git a/frame/staking/src/testing_utils.rs b/frame/staking/src/testing_utils.rs index 6a95838a09..2a38f47f4e 100644 --- a/frame/staking/src/testing_utils.rs +++ b/frame/staking/src/testing_utils.rs @@ -15,142 +15,130 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Testing utils for staking. Needs the `testing-utils` feature to be enabled. -//! -//! Note that these helpers should NOT be used with the actual crate tests, but are rather designed -//! for when the module is being externally tested (i.e. fuzzing, benchmarking, e2e tests). Enabling -//! this feature in the current crate's Cargo.toml will leak all of this into a normal release -//! build. Just don't do it. +//! Testing utils for staking. Provides some common functions to setup staking state, such as +//! bonding validators, nominators, and generating different types of solutions. use crate::*; -use codec::{Decode, Encode}; -use frame_support::assert_ok; +use crate::Module as Staking; +use frame_benchmarking::{account}; use frame_system::RawOrigin; -use pallet_indices::address::Address; -use rand::Rng; -use sp_core::hashing::blake2_256; -use sp_phragmen::{ - build_support_map, evaluate_support, reduce, Assignment, PhragmenScore, StakedAssignment, -}; - -const CTRL_PREFIX: u32 = 1000; -const NOMINATOR_PREFIX: u32 = 1_000_000; - -/// A dummy suer. -pub const USER: u32 = 999_999_999; - -/// Address type of the `T` -pub type AddressOf = Address<::AccountId, u32>; - -/// Random number in the range `[a, b]`. -pub fn random(a: u32, b: u32) -> u32 { - rand::thread_rng().gen_range(a, b) +use sp_io::hashing::blake2_256; +use rand_chacha::{rand_core::{RngCore, SeedableRng}, ChaChaRng}; +use sp_phragmen::*; + +const SEED: u32 = 0; + +/// Grab a funded user. +pub fn create_funded_user(string: &'static str, n: u32, balance_factor: u32) -> T::AccountId { + let user = account(string, n, SEED); + let balance = T::Currency::minimum_balance() * balance_factor.into(); + T::Currency::make_free_balance_be(&user, balance); + // ensure T::CurrencyToVote will work correctly. + T::Currency::issue(balance); + user } -/// Set the desired validator count, with related storage items. -pub fn set_validator_count(to_elect: u32) { - ValidatorCount::put(to_elect); - MinimumValidatorCount::put(to_elect / 2); - >::put(ElectionStatus::Closed); -} - -/// Build an account with the given index. -pub fn account(index: u32) -> T::AccountId { - let entropy = (b"benchmark/staking", index).using_encoded(blake2_256); - T::AccountId::decode(&mut &entropy[..]).unwrap_or_default() +/// Create a stash and controller pair. +pub fn create_stash_controller(n: u32, balance_factor: u32) + -> Result<(T::AccountId, T::AccountId), &'static str> +{ + let stash = create_funded_user::("stash", n, balance_factor); + let controller = create_funded_user::("controller", n, balance_factor); + let controller_lookup: ::Source = T::Lookup::unlookup(controller.clone()); + let reward_destination = RewardDestination::Staked; + let amount = T::Currency::minimum_balance() * (balance_factor / 10).max(1).into(); + Staking::::bond(RawOrigin::Signed(stash.clone()).into(), controller_lookup, amount, reward_destination)?; + return Ok((stash, controller)) } -/// Build an address given Index -pub fn address(index: u32) -> AddressOf { - pallet_indices::address::Address::Id(account::(index)) +/// create `max` validators. +pub fn create_validators( + max: u32, + balance_factor: u32, +) -> Result::Source>, &'static str> { + let mut validators: Vec<::Source> = Vec::with_capacity(max as usize); + for i in 0 .. max { + let (stash, controller) = create_stash_controller::(i, balance_factor)?; + let validator_prefs = ValidatorPrefs { + commission: Perbill::from_percent(50), + }; + Staking::::validate(RawOrigin::Signed(controller).into(), validator_prefs)?; + let stash_lookup: ::Source = T::Lookup::unlookup(stash); + validators.push(stash_lookup); + } + Ok(validators) } -/// Generate signed origin from `who`. -pub fn signed(who: T::AccountId) -> T::Origin { - RawOrigin::Signed(who).into() -} +/// This function generates validators and nominators who are randomly nominating +/// `edge_per_nominator` random validators (until `to_nominate` if provided). +/// +/// Parameters: +/// - `validators`: number of bonded validators +/// - `nominators`: number of bonded nominators. +/// - `edge_per_nominator`: number of edge (vote) per nominator. +/// - `randomize_stake`: whether to randomize the stakes. +/// - `to_nominate`: if `Some(n)`, only the first `n` bonded validator are voted upon. +/// Else, all of them are considered and `edge_per_nominator` random validators are voted for. +/// +/// Return the validators choosen to be nominated. +pub fn create_validators_with_nominators_for_era( + validators: u32, + nominators: u32, + edge_per_nominator: usize, + randomize_stake: bool, + to_nominate: Option, +) -> Result::Source>, &'static str> { + let mut validators_stash: Vec<::Source> + = Vec::with_capacity(validators as usize); + let mut rng = ChaChaRng::from_seed(SEED.using_encoded(blake2_256)); + + // Create validators + for i in 0 .. validators { + let balance_factor = if randomize_stake { rng.next_u32() % 255 + 10 } else { 100u32 }; + let (v_stash, v_controller) = create_stash_controller::(i, balance_factor)?; + let validator_prefs = ValidatorPrefs { + commission: Perbill::from_percent(50), + }; + Staking::::validate(RawOrigin::Signed(v_controller.clone()).into(), validator_prefs)?; + let stash_lookup: ::Source = T::Lookup::unlookup(v_stash.clone()); + validators_stash.push(stash_lookup.clone()); + } -/// Generate signed origin from `index`. -pub fn signed_account(index: u32) -> T::Origin { - signed::(account::(index)) -} + let to_nominate = to_nominate.unwrap_or(validators_stash.len() as u32) as usize; + let validator_choosen = validators_stash[0..to_nominate].to_vec(); + + // Create nominators + for j in 0 .. nominators { + let balance_factor = if randomize_stake { rng.next_u32() % 255 + 10 } else { 100u32 }; + let (_n_stash, n_controller) = create_stash_controller::( + u32::max_value() - j, + balance_factor, + )?; + + // Have them randomly validate + let mut available_validators = validator_choosen.clone(); + let mut selected_validators: Vec<::Source> = + Vec::with_capacity(edge_per_nominator); + + for _ in 0 .. validators.min(edge_per_nominator as u32) { + let selected = rng.next_u32() as usize % available_validators.len(); + let validator = available_validators.remove(selected); + selected_validators.push(validator); + } + Staking::::nominate(RawOrigin::Signed(n_controller.clone()).into(), selected_validators)?; + } -/// Bond a validator. -pub fn bond_validator(stash: T::AccountId, ctrl: u32, val: BalanceOf) -where - T::Lookup: StaticLookup>, -{ - let _ = T::Currency::make_free_balance_be(&stash, val); - assert_ok!(>::bond( - signed::(stash), - address::(ctrl), - val, - RewardDestination::Controller - )); - assert_ok!(>::validate( - signed_account::(ctrl), - ValidatorPrefs::default() - )); -} + ValidatorCount::put(validators); -pub fn bond_nominator( - stash: T::AccountId, - ctrl: u32, - val: BalanceOf, - target: Vec>, -) where - T::Lookup: StaticLookup>, -{ - let _ = T::Currency::make_free_balance_be(&stash, val); - assert_ok!(>::bond( - signed::(stash), - address::(ctrl), - val, - RewardDestination::Controller - )); - assert_ok!(>::nominate(signed_account::(ctrl), target)); + Ok(validator_choosen) } -/// Bond `nun_validators` validators and `num_nominator` nominators with `edge_per_voter` random -/// votes per nominator. -pub fn setup_chain_stakers(num_validators: u32, num_voters: u32, edge_per_voter: u32) -where - T::Lookup: StaticLookup>, -{ - (0..num_validators).for_each(|i| { - bond_validator::( - account::(i), - i + CTRL_PREFIX, - >::from(random(1, 1000)) * T::Currency::minimum_balance(), - ); - }); - - (0..num_voters).for_each(|i| { - let mut targets: Vec> = Vec::with_capacity(edge_per_voter as usize); - let mut all_targets = (0..num_validators) - .map(|t| address::(t)) - .collect::>(); - assert!(num_validators >= edge_per_voter); - (0..edge_per_voter).for_each(|_| { - let target = all_targets.remove(random(0, all_targets.len() as u32 - 1) as usize); - targets.push(target); - }); - bond_nominator::( - account::(i + NOMINATOR_PREFIX), - i + NOMINATOR_PREFIX + CTRL_PREFIX, - >::from(random(1, 1000)) * T::Currency::minimum_balance(), - targets, - ); - }); - - >::create_stakers_snapshot(); -} /// Build a _really bad_ but acceptable solution for election. This should always yield a solution /// which has a less score than the seq-phragmen. pub fn get_weak_solution( do_reduce: bool, -) -> (Vec, CompactAssignments, PhragmenScore) { +) -> (Vec, CompactAssignments, PhragmenScore, ElectionSize) { let mut backing_stake_of: BTreeMap> = BTreeMap::new(); // self stake @@ -159,68 +147,19 @@ pub fn get_weak_solution( >::slashable_balance_of(&who) }); - // add nominator stuff - >::iter().for_each(|(who, nomination)| { - nomination.targets.into_iter().for_each(|v| { - *backing_stake_of.entry(v).or_insert(Zero::zero()) += - >::slashable_balance_of(&who) - }) - }); - - // elect winners + // elect winners. We chose the.. least backed ones. let mut sorted: Vec = backing_stake_of.keys().cloned().collect(); sorted.sort_by_key(|x| backing_stake_of.get(x).unwrap()); let winners: Vec = sorted .iter() + .rev() .cloned() .take(>::validator_count() as usize) .collect(); let mut staked_assignments: Vec> = Vec::new(); - >::iter().for_each(|(who, nomination)| { - let mut dist: Vec<(T::AccountId, ExtendedBalance)> = Vec::new(); - nomination.targets.into_iter().for_each(|v| { - if winners.iter().find(|&w| *w == v).is_some() { - dist.push((v, ExtendedBalance::zero())); - } - }); - - if dist.len() == 0 { - return; - } - - // assign real stakes. just split the stake. - let stake = , u64>>::convert( - >::slashable_balance_of(&who), - ) as ExtendedBalance; - - let mut sum: ExtendedBalance = Zero::zero(); - let dist_len = dist.len() as ExtendedBalance; - - // assign main portion - // only take the first half into account. This should highly imbalance stuff, which is good. - dist.iter_mut() - .take(if dist_len > 1 { - (dist_len as usize) / 2 - } else { - 1 - }) - .for_each(|(_, w)| { - let partial = stake / dist_len; - *w = partial; - sum += partial; - }); - - // assign the leftover to last. - let leftover = stake - sum; - let last = dist.last_mut().unwrap(); - last.1 += leftover; - - staked_assignments.push(StakedAssignment { - who, - distribution: dist, - }); - }); + // you could at this point start adding some of the nominator's stake, but for now we don't. + // This solution must be bad. // add self support to winners. winners.iter().for_each(|w| { @@ -255,10 +194,10 @@ pub fn get_weak_solution( .position(|x| x == a) .and_then(|i| >::try_into(i).ok()) }; - let stake_of = |who: &T::AccountId| -> ExtendedBalance { + let stake_of = |who: &T::AccountId| -> VoteWeight { , u64>>::convert( >::slashable_balance_of(who), - ) as ExtendedBalance + ) }; // convert back to ratio assignment. This takes less space. @@ -270,13 +209,10 @@ pub fn get_weak_solution( // re-calculate score based on what the chain will decode. let score = { - let staked: Vec> = low_accuracy_assignment - .iter() - .map(|a| { - let stake = stake_of(&a.who); - a.clone().into_staked(stake, true) - }) - .collect(); + let staked = assignment_ratio_to_staked::<_, OffchainAccuracy, _>( + low_accuracy_assignment.clone(), + stake_of + ); let (support_map, _) = build_support_map::(winners.as_slice(), staked.as_slice()); @@ -304,14 +240,19 @@ pub fn get_weak_solution( }) .collect::>(); - (winners, compact, score) + let size = ElectionSize { + validators: snapshot_validators.len() as ValidatorIndex, + nominators: snapshot_nominators.len() as NominatorIndex, + }; + + (winners, compact, score, size) } /// Create a solution for seq-phragmen. This uses the same internal function as used by the offchain /// worker code. pub fn get_seq_phragmen_solution( do_reduce: bool, -) -> (Vec, CompactAssignments, PhragmenScore) { +) -> (Vec, CompactAssignments, PhragmenScore, ElectionSize) { let sp_phragmen::PhragmenResult { winners, assignments, @@ -320,29 +261,40 @@ pub fn get_seq_phragmen_solution( offchain_election::prepare_submission::(assignments, winners, do_reduce).unwrap() } -/// Remove all validator, nominators, votes and exposures. -pub fn clean(era: EraIndex) - where - ::AccountId: codec::EncodeLike, - u32: codec::EncodeLike, -{ - >::iter().for_each(|(k, _)| { - let ctrl = >::bonded(&k).unwrap(); - >::remove(&k); - >::remove(&k); - >::remove(&ctrl); - >::remove(k, era); - }); - >::iter().for_each(|(k, _)| >::remove(k)); - >::remove_all(); - >::remove_all(); - >::kill(); - QueuedScore::kill(); +/// Returns a solution in which only one winner is elected with just a self vote. +pub fn get_single_winner_solution( + winner: T::AccountId +) -> Result<(Vec, CompactAssignments, PhragmenScore, ElectionSize), &'static str> { + let snapshot_validators = >::snapshot_validators().unwrap(); + let snapshot_nominators = >::snapshot_nominators().unwrap(); + + let val_index = snapshot_validators.iter().position(|x| *x == winner).ok_or("not a validator")?; + let nom_index = snapshot_nominators.iter().position(|x| *x == winner).ok_or("not a nominator")?; + + let stake = >::slashable_balance_of(&winner); + let stake = , VoteWeight>>::convert(stake) + as ExtendedBalance; + + let val_index = val_index as ValidatorIndex; + let nom_index = nom_index as NominatorIndex; + + let winners = vec![val_index]; + let compact = CompactAssignments { + votes1: vec![(nom_index, val_index)], + ..Default::default() + }; + let score = [stake, stake, stake * stake]; + let size = ElectionSize { + validators: snapshot_validators.len() as ValidatorIndex, + nominators: snapshot_nominators.len() as NominatorIndex, + }; + + Ok((winners, compact, score, size)) } /// get the active era. -pub fn active_era() -> EraIndex { - >::active_era().unwrap().index +pub fn current_era() -> EraIndex { + >::current_era().unwrap_or(0) } /// initialize the first era. @@ -352,3 +304,33 @@ pub fn init_active_era() { start: None, }) } + +/// Create random assignments for the given list of winners. Each assignment will have +/// MAX_NOMINATIONS edges. +pub fn create_assignments_for_offchain( + num_assignments: u32, + winners: Vec<::Source>, +) -> Result< + ( + Vec<(T::AccountId, ExtendedBalance)>, + Vec>, + ), + &'static str +> { + let ratio = OffchainAccuracy::from_rational_approximation(1, MAX_NOMINATIONS); + let assignments: Vec> = >::iter() + .take(num_assignments as usize) + .map(|(n, t)| Assignment { + who: n, + distribution: t.targets.iter().map(|v| (v.clone(), ratio)).collect(), + }) + .collect(); + + ensure!(assignments.len() == num_assignments as usize, "must bench for `a` assignments"); + + let winners = winners.into_iter().map(|v| { + (::lookup(v).unwrap(), 0) + }).collect(); + + Ok((winners, assignments)) +} diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 31137e04eb..12ae71c1cd 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -2753,7 +2753,10 @@ fn remove_multi_deferred() { mod offchain_phragmen { use crate::*; use codec::Encode; - use frame_support::{assert_noop, assert_ok}; + use frame_support::{ + assert_noop, assert_ok, assert_err_with_weight, + dispatch::DispatchResultWithPostInfo, + }; use sp_runtime::transaction_validity::TransactionSource; use mock::*; use parking_lot::RwLock; @@ -2808,6 +2811,29 @@ mod offchain_phragmen { pool_state } + fn election_size() -> ElectionSize { + ElectionSize { + validators: Staking::snapshot_validators().unwrap().len() as ValidatorIndex, + nominators: Staking::snapshot_nominators().unwrap().len() as NominatorIndex, + } + } + + fn submit_solution( + origin: Origin, + winners: Vec, + compact: CompactAssignments, + score: PhragmenScore, + ) -> DispatchResultWithPostInfo { + Staking::submit_election_solution( + origin, + winners, + compact, + score, + current_era(), + election_size(), + ) + } + #[test] fn is_current_session_final_works() { ExtBuilder::default() @@ -2996,12 +3022,11 @@ mod offchain_phragmen { assert!(Staking::snapshot_validators().is_some()); let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), )); let queued_result = Staking::queued_elected().unwrap(); @@ -3039,13 +3064,7 @@ mod offchain_phragmen { assert_eq!(Staking::era_election_status(), ElectionStatus::Open(12)); let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); - assert_ok!(Staking::submit_election_solution( - Origin::signed(10), - winners, - compact, - score, - current_era(), - )); + assert_ok!(submit_solution(Origin::signed(10), winners, compact, score)); let queued_result = Staking::queued_elected().unwrap(); assert_eq!(queued_result.compute, ElectionCompute::Signed); @@ -3088,15 +3107,17 @@ mod offchain_phragmen { let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); Staking::kill_stakers_snapshot(); - assert_noop!( + assert_err_with_weight!( Staking::submit_election_solution( Origin::signed(10), - winners, - compact, + winners.clone(), + compact.clone(), score, current_era(), + ElectionSize::default(), ), Error::::PhragmenEarlySubmission, + Some(::DbWeight::get().reads(1)), ); }) } @@ -3115,25 +3136,24 @@ mod offchain_phragmen { // a good solution let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), )); // a bad solution let (compact, winners, score) = horrible_phragmen_with_post_processing(false); - assert_noop!( - Staking::submit_election_solution( + assert_err_with_weight!( + submit_solution( Origin::signed(10), - winners, - compact, + winners.clone(), + compact.clone(), score, - current_era(), ), Error::::PhragmenWeakSubmission, + Some(::DbWeight::get().reads(3)) ); }) } @@ -3152,22 +3172,20 @@ mod offchain_phragmen { // a meeeeh solution let (compact, winners, score) = horrible_phragmen_with_post_processing(false); - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), )); // a better solution let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), )); }) } @@ -3268,12 +3286,11 @@ mod offchain_phragmen { run_to_block(12); // put a good solution on-chain let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ),); // now run the offchain worker in the same chain state. @@ -3318,6 +3335,28 @@ mod offchain_phragmen { assert_eq!(winners.len(), 3); + assert_noop!( + submit_solution( + Origin::signed(10), + winners, + compact, + score, + ), + Error::::PhragmenBogusWinnerCount, + ); + }) + } + + #[test] + fn invalid_phragmen_result_solution_size() { + ExtBuilder::default() + .offchain_phragmen_ext() + .build() + .execute_with(|| { + run_to_block(12); + + let (compact, winners, score) = prepare_submission_with(true, 2, |_| {}); + assert_noop!( Staking::submit_election_solution( Origin::signed(10), @@ -3325,8 +3364,9 @@ mod offchain_phragmen { compact, score, current_era(), + ElectionSize::default(), ), - Error::::PhragmenBogusWinnerCount, + Error::::PhragmenBogusElectionSize, ); }) } @@ -3350,12 +3390,11 @@ mod offchain_phragmen { assert_eq!(winners.len(), 3); assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusWinnerCount, ); @@ -3379,12 +3418,11 @@ mod offchain_phragmen { assert_eq!(winners.len(), 4); // all good. We chose 4 and it works. - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ),); }) } @@ -3410,12 +3448,11 @@ mod offchain_phragmen { // The error type sadly cannot be more specific now. assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusCompact, ); @@ -3443,12 +3480,11 @@ mod offchain_phragmen { // The error type sadly cannot be more specific now. assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusCompact, ); @@ -3475,12 +3511,11 @@ mod offchain_phragmen { let winners = vec![0, 1, 2, 4]; assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusWinner, ); @@ -3511,12 +3546,11 @@ mod offchain_phragmen { }); assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusEdge, ); @@ -3547,12 +3581,11 @@ mod offchain_phragmen { }); assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusSelfVote, ); @@ -3583,12 +3616,11 @@ mod offchain_phragmen { // This raises score issue. assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusSelfVote, ); @@ -3618,12 +3650,11 @@ mod offchain_phragmen { } assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusCompact, ); @@ -3660,12 +3691,11 @@ mod offchain_phragmen { }); assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusNomination, ); @@ -3723,12 +3753,11 @@ mod offchain_phragmen { }); // can be submitted. - assert_ok!(Staking::submit_election_solution( + assert_ok!(submit_solution( Origin::signed(10), winners, compact, score, - current_era(), )); // a wrong solution. @@ -3742,12 +3771,11 @@ mod offchain_phragmen { // is rejected. assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenSlashedNomination, ); @@ -3770,12 +3798,11 @@ mod offchain_phragmen { score[0] += 1; assert_noop!( - Staking::submit_election_solution( + submit_solution( Origin::signed(10), winners, compact, score, - current_era(), ), Error::::PhragmenBogusScore, ); diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 11109fb177..68d56ee955 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -218,6 +218,7 @@ macro_rules! assert_err_ignore_postinfo { } } +/// Assert an expression returns error with the given weight. #[macro_export] #[cfg(feature = "std")] macro_rules! assert_err_with_weight { diff --git a/primitives/phragmen/compact/src/lib.rs b/primitives/phragmen/compact/src/lib.rs index cbd8596a59..735e0abaa6 100644 --- a/primitives/phragmen/compact/src/lib.rs +++ b/primitives/phragmen/compact/src/lib.rs @@ -158,6 +158,23 @@ fn struct_def( ) }).collect::(); + + let len_impl = (1..=count).map(|c| { + let field_name = field_name_for(c); + quote!( + all_len = all_len.saturating_add(self.#field_name.len()); + ) + }).collect::(); + + let edge_count_impl = (1..count).map(|c| { + let field_name = field_name_for(c); + quote!( + all_edges = all_edges.saturating_add( + self.#field_name.len().saturating_mul(#c as usize) + ); + ) + }).collect::(); + Ok(quote! ( /// A struct to encode a Phragmen assignment in a compact way. #[derive( @@ -181,6 +198,28 @@ fn struct_def( { const LIMIT: usize = #count; } + + impl<#voter_type, #target_type, #weight_type> #ident<#voter_type, #target_type, #weight_type> { + /// Get the length of all the assignments that this type is encoding. This is basically + /// the same as the number of assignments, or the number of voters in total. + pub fn len(&self) -> usize { + let mut all_len = 0usize; + #len_impl + all_len + } + + /// Get the total count of edges. + pub fn edge_count(&self) -> usize { + let mut all_edges = 0usize; + #edge_count_impl + all_edges + } + + /// Get the average edge count. + pub fn average_edge_count(&self) -> usize { + self.edge_count().checked_div(self.len()).unwrap_or(0) + } + } )) } diff --git a/primitives/phragmen/src/tests.rs b/primitives/phragmen/src/tests.rs index c7b43e8a3c..0219c35a8b 100644 --- a/primitives/phragmen/src/tests.rs +++ b/primitives/phragmen/src/tests.rs @@ -672,6 +672,8 @@ mod compact { compact, Decode::decode(&mut &encoded[..]).unwrap(), ); + assert_eq!(compact.len(), 4); + assert_eq!(compact.edge_count(), 2 + 4); } fn basic_ratio_test_with() where @@ -747,6 +749,13 @@ mod compact { target_index, ).unwrap(); + // basically number of assignments that it is encoding. + assert_eq!(compacted.len(), assignments.len()); + assert_eq!( + compacted.edge_count(), + assignments.iter().fold(0, |a, b| a + b.distribution.len()), + ); + assert_eq!( compacted, TestCompact { @@ -844,6 +853,11 @@ mod compact { voter_index, target_index, ).unwrap(); + assert_eq!(compacted.len(), assignments.len()); + assert_eq!( + compacted.edge_count(), + assignments.iter().fold(0, |a, b| a + b.distribution.len()), + ); assert_eq!( compacted, diff --git a/utils/frame/benchmarking-cli/src/command.rs b/utils/frame/benchmarking-cli/src/command.rs index ed63ec5e5d..f867d75d2a 100644 --- a/utils/frame/benchmarking-cli/src/command.rs +++ b/utils/frame/benchmarking-cli/src/command.rs @@ -27,7 +27,12 @@ use sc_service::{Configuration, NativeExecutionDispatch}; use sp_runtime::{ traits::{Block as BlockT, Header as HeaderT, NumberFor}, }; -use sp_core::{tasks, testing::KeyStore, traits::KeystoreExt}; +use sp_core::{ + tasks, + testing::KeyStore, + traits::KeystoreExt, + offchain::{OffchainExt, testing::TestOffchainExt}, +}; use std::fmt::Debug; impl BenchmarkCmd { @@ -56,6 +61,8 @@ impl BenchmarkCmd { let mut extensions = Extensions::default(); extensions.register(KeystoreExt(KeyStore::new())); + let (offchain, _) = TestOffchainExt::new(); + extensions.register(OffchainExt::new(offchain)); let result = StateMachine::<_, _, NumberFor, _>::new( &state, -- GitLab From ffa32fa60767838b4ec779fb6ac42e7516600a7d Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Mon, 25 May 2020 13:25:49 +0200 Subject: [PATCH 111/150] Fix default base path on windows (#6120) * Use directories instead of app_dirs * Use local data dir --- Cargo.lock | 40 +--------------------------------------- client/cli/Cargo.toml | 2 +- client/cli/src/config.rs | 13 ++++--------- 3 files changed, 6 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc2c435b3a..77119aa760 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -112,18 +112,6 @@ version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2494382e9ba43995f3c56359e518641f450f5c36feeb4632a75cde2ec297c867" -[[package]] -name = "app_dirs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" -dependencies = [ - "ole32-sys", - "shell32-sys", - "winapi 0.2.8", - "xdg", -] - [[package]] name = "approx" version = "0.3.2" @@ -3906,16 +3894,6 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" -[[package]] -name = "ole32-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "once_cell" version = "1.4.0" @@ -5980,10 +5958,10 @@ name = "sc-cli" version = "0.8.0-dev" dependencies = [ "ansi_term 0.12.1", - "app_dirs", "atty", "chrono", "derive_more", + "directories", "env_logger 0.7.1", "fdlimit", "futures 0.3.5", @@ -7145,16 +7123,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "shell32-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee04b46101f57121c9da2b151988283b6beb79b34f5bb29a58ee48cb695122c" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "shlex" version = "0.1.1" @@ -9618,12 +9586,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "xdg" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" - [[package]] name = "yamux" version = "0.4.5" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 406bb1becc..de67879295 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -20,7 +20,7 @@ regex = "1.3.1" time = "0.1.42" ansi_term = "0.12.1" lazy_static = "1.4.0" -app_dirs = "1.2.1" +directories = "2.0.2" tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.4" fdlimit = "0.1.4" diff --git a/client/cli/src/config.rs b/client/cli/src/config.rs index fdaee929a6..a1ee1b0cc1 100644 --- a/client/cli/src/config.rs +++ b/client/cli/src/config.rs @@ -24,7 +24,6 @@ use crate::{ init_logger, DatabaseParams, ImportParams, KeystoreParams, NetworkParams, NodeKeyParams, OffchainWorkerParams, PruningParams, SharedParams, SubstrateCli, }; -use app_dirs::{AppDataType, AppInfo}; use names::{Generator, Name}; use sc_client_api::execution_extensions::ExecutionStrategies; use sc_service::config::{ @@ -406,14 +405,10 @@ pub trait CliConfiguration: Sized { let config_dir = self .base_path()? .unwrap_or_else(|| { - app_dirs::get_app_root( - AppDataType::UserData, - &AppInfo { - name: C::executable_name(), - author: C::author(), - }, - ) - .expect("app directories exist on all supported platforms; qed") + directories::ProjectDirs::from("", "", C::executable_name()) + .expect("app directories exist on all supported platforms; qed") + .data_local_dir() + .into() }) .join("chains") .join(chain_spec.id()); -- GitLab From 6dd95319ed853aee046f3fd86fb64b61f9d1d725 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Mon, 25 May 2020 17:52:50 +0300 Subject: [PATCH 112/150] Benchmarks sanity checks (#6119) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add read-only externalities * sanity checks * cleanup * Update primitives/state-machine/src/read_only.rs Co-authored-by: Bastian Köcher * fix typo * add error exit code if nothing was run Co-authored-by: Bastian Köcher --- Cargo.lock | 1 + bin/node/bench/Cargo.toml | 1 + bin/node/bench/src/import.rs | 38 +++++ bin/node/bench/src/main.rs | 5 + primitives/state-machine/src/lib.rs | 2 + primitives/state-machine/src/read_only.rs | 194 ++++++++++++++++++++++ 6 files changed, 241 insertions(+) create mode 100644 primitives/state-machine/src/read_only.rs diff --git a/Cargo.lock b/Cargo.lock index 77119aa760..8194436e1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3394,6 +3394,7 @@ dependencies = [ "lazy_static", "log", "node-primitives", + "node-runtime", "node-testing", "parity-db", "parity-util-mem", diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index ec72a125bb..70147db207 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -12,6 +12,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" log = "0.4.8" node-primitives = { version = "2.0.0-dev", path = "../primitives" } node-testing = { version = "2.0.0-dev", path = "../testing" } +node-runtime = { version = "2.0.0-dev", path = "../runtime" } sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } diff --git a/bin/node/bench/src/import.rs b/bin/node/bench/src/import.rs index 5cbb851867..c1b324c03c 100644 --- a/bin/node/bench/src/import.rs +++ b/bin/node/bench/src/import.rs @@ -36,6 +36,7 @@ use node_testing::bench::{BenchDb, Profile, BlockType, KeyTypes, DatabaseType}; use node_primitives::Block; use sc_client_api::backend::Backend; use sp_runtime::generic::BlockId; +use sp_state_machine::InspectState; use crate::core::{self, Path, Mode}; @@ -81,6 +82,7 @@ pub struct ImportBenchmark { profile: Profile, database: BenchDb, block: Block, + block_type: BlockType, } impl core::BenchmarkDescription for ImportBenchmarkDescription { @@ -124,6 +126,7 @@ impl core::BenchmarkDescription for ImportBenchmarkDescription { let block = bench_db.generate_block(self.block_type.to_content(self.size.transactions())); Box::new(ImportBenchmark { database: bench_db, + block_type: self.block_type, block, profile, }) @@ -155,6 +158,41 @@ impl core::Benchmark for ImportBenchmark { context.import_block(self.block.clone()); let elapsed = start.elapsed(); + // Sanity checks. + context.client.state_at(&BlockId::number(1)).expect("state_at failed for block#1") + .inspect_with(|| { + match self.block_type { + BlockType::RandomTransfersKeepAlive => { + // should be 5 per signed extrinsic + 1 per unsigned + // we have 1 unsigned and the rest are signed in the block + // those 5 events per signed are: + // - new account (RawEvent::NewAccount) as we always transfer fund to non-existant account + // - endowed (RawEvent::Endowed) for this new account + // - successful transfer (RawEvent::Transfer) for this transfer operation + // - deposit event for charging transaction fee + // - extrinsic success + assert_eq!( + node_runtime::System::events().len(), + (self.block.extrinsics.len() - 1) * 5 + 1, + ); + }, + BlockType::Noop => { + assert_eq!( + node_runtime::System::events().len(), + + // should be 2 per signed extrinsic + 1 per unsigned + // we have 1 unsigned and the rest are signed in the block + // those 2 events per signed are: + // - deposit event for charging transaction fee + // - extrinsic success + (self.block.extrinsics.len() - 1) * 2 + 1, + ); + }, + _ => {}, + } + } + ); + if mode == Mode::Profile { std::thread::park_timeout(std::time::Duration::from_secs(1)); } diff --git a/bin/node/bench/src/main.rs b/bin/node/bench/src/main.rs index 419aacb6a5..5c5af37038 100644 --- a/bin/node/bench/src/main.rs +++ b/bin/node/bench/src/main.rs @@ -152,6 +152,11 @@ fn main() { } } + if results.is_empty() { + eprintln!("No benchmark was found for query"); + std::process::exit(1); + } + if opt.json { let json_result: String = serde_json::to_string(&results).expect("Failed to construct json"); println!("{}", json_result); diff --git a/primitives/state-machine/src/lib.rs b/primitives/state-machine/src/lib.rs index 3a54ef08f3..693a7bc12f 100644 --- a/primitives/state-machine/src/lib.rs +++ b/primitives/state-machine/src/lib.rs @@ -42,10 +42,12 @@ mod proving_backend; mod trie_backend; mod trie_backend_essence; mod stats; +mod read_only; pub use sp_trie::{trie_types::{Layout, TrieDBMut}, StorageProof, TrieMut, DBValue, MemoryDB}; pub use testing::TestExternalities; pub use basic::BasicExternalities; +pub use read_only::{ReadOnlyExternalities, InspectState}; pub use ext::Ext; pub use backend::Backend; pub use changes_trie::{ diff --git a/primitives/state-machine/src/read_only.rs b/primitives/state-machine/src/read_only.rs new file mode 100644 index 0000000000..817282f8e7 --- /dev/null +++ b/primitives/state-machine/src/read_only.rs @@ -0,0 +1,194 @@ +// This file is part of Substrate. + +// Copyright (C) 2020 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Read-only version of Externalities. + +use std::{ + any::{TypeId, Any}, + marker::PhantomData, +}; +use crate::{Backend, StorageKey, StorageValue}; +use hash_db::Hasher; +use sp_core::{ + storage::ChildInfo, + traits::Externalities, Blake2Hasher, +}; +use codec::Encode; + +/// Trait for inspecting state in any backend. +/// +/// Implemented for any backend. +pub trait InspectState> { + /// Inspect state with a closure. + /// + /// Self will be set as read-only externalities and inspection + /// closure will be run against it. + fn inspect_with(&self, f: F); +} + +impl> InspectState for B { + fn inspect_with(&self, f: F) { + ReadOnlyExternalities::from(self).execute_with(f) + } +} + +/// Simple read-only externalities for any backend. +/// +/// To be used in test for state inspection. Will panic if something writes +/// to the storage. +#[derive(Debug)] +pub struct ReadOnlyExternalities<'a, H: Hasher, B: 'a + Backend> { + backend: &'a B, + _phantom: PhantomData, +} + +impl<'a, H: Hasher, B: 'a + Backend> From<&'a B> for ReadOnlyExternalities<'a, H, B> { + fn from(backend: &'a B) -> Self { + ReadOnlyExternalities { backend, _phantom: PhantomData } + } +} + +impl<'a, H: Hasher, B: 'a + Backend> ReadOnlyExternalities<'a, H, B> { + /// Execute the given closure while `self` is set as externalities. + /// + /// Returns the result of the given closure. + pub fn execute_with(&mut self, f: impl FnOnce() -> R) -> R { + sp_externalities::set_and_run_with_externalities(self, f) + } +} + +impl<'a, H: Hasher, B: 'a + Backend> Externalities for ReadOnlyExternalities<'a, H, B> { + fn set_offchain_storage(&mut self, _key: &[u8], _value: Option<&[u8]>) { + panic!("Should not be used in read-only externalities!") + } + + fn storage(&self, key: &[u8]) -> Option { + self.backend.storage(key).expect("Backed failed for storage in ReadOnlyExternalities") + } + + fn storage_hash(&self, key: &[u8]) -> Option> { + self.storage(key).map(|v| Blake2Hasher::hash(&v).encode()) + } + + fn child_storage( + &self, + child_info: &ChildInfo, + key: &[u8], + ) -> Option { + self.backend.child_storage(child_info, key).expect("Backed failed for child_storage in ReadOnlyExternalities") + } + + fn child_storage_hash( + &self, + child_info: &ChildInfo, + key: &[u8], + ) -> Option> { + self.child_storage(child_info, key).map(|v| Blake2Hasher::hash(&v).encode()) + } + + fn next_storage_key(&self, key: &[u8]) -> Option { + self.backend.next_storage_key(key).expect("Backed failed for next_storage_key in ReadOnlyExternalities") + } + + fn next_child_storage_key( + &self, + child_info: &ChildInfo, + key: &[u8], + ) -> Option { + self.backend.next_child_storage_key(child_info, key) + .expect("Backed failed for next_child_storage_key in ReadOnlyExternalities") + } + + fn place_storage(&mut self, _key: StorageKey, _maybe_value: Option) { + unimplemented!("place_storage not supported in ReadOnlyExternalities") + } + + fn place_child_storage( + &mut self, + _child_info: &ChildInfo, + _key: StorageKey, + _value: Option, + ) { + unimplemented!("place_child_storage not supported in ReadOnlyExternalities") + } + + fn kill_child_storage( + &mut self, + _child_info: &ChildInfo, + ) { + unimplemented!("kill_child_storage is not supported in ReadOnlyExternalities") + } + + fn clear_prefix(&mut self, _prefix: &[u8]) { + unimplemented!("clear_prefix is not supported in ReadOnlyExternalities") + } + + fn clear_child_prefix( + &mut self, + _child_info: &ChildInfo, + _prefix: &[u8], + ) { + unimplemented!("clear_child_prefix is not supported in ReadOnlyExternalities") + } + + fn storage_append( + &mut self, + _key: Vec, + _value: Vec, + ) { + unimplemented!("storage_append is not supported in ReadOnlyExternalities") + } + + fn chain_id(&self) -> u64 { 42 } + + fn storage_root(&mut self) -> Vec { + unimplemented!("storage_root is not supported in ReadOnlyExternalities") + } + + fn child_storage_root( + &mut self, + _child_info: &ChildInfo, + ) -> Vec { + unimplemented!("child_storage_root is not supported in ReadOnlyExternalities") + } + + fn storage_changes_root(&mut self, _parent: &[u8]) -> Result>, ()> { + unimplemented!("storage_changes_root is not supported in ReadOnlyExternalities") + } + + fn wipe(&mut self) {} + + fn commit(&mut self) {} +} + +impl<'a, H: Hasher, B: 'a + Backend> sp_externalities::ExtensionStore for ReadOnlyExternalities<'a, H, B> { + fn extension_by_type_id(&mut self, _type_id: TypeId) -> Option<&mut dyn Any> { + unimplemented!("extension_by_type_id is not supported in ReadOnlyExternalities") + } + + fn register_extension_with_type_id( + &mut self, + _type_id: TypeId, + _extension: Box, + ) -> Result<(), sp_externalities::Error> { + unimplemented!("register_extension_with_type_id is not supported in ReadOnlyExternalities") + } + + fn deregister_extension_by_type_id(&mut self, _type_id: TypeId) -> Result<(), sp_externalities::Error> { + unimplemented!("deregister_extension_by_type_id is not supported in ReadOnlyExternalities") + } +} -- GitLab From b5e84bb598be11469a9875ad9e17b228701ddc3f Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Mon, 25 May 2020 17:11:47 +0200 Subject: [PATCH 113/150] Events and better log for staking. (#6118) * Events and better log for staking. * Fix build * Update frame/staking/src/lib.rs Co-authored-by: Marcio Diaz Co-authored-by: Marcio Diaz --- frame/staking/src/lib.rs | 22 ++++++++++++++-------- frame/staking/src/offchain_election.rs | 6 +++--- frame/staking/src/tests.rs | 15 +++++++++++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 526d094eac..4e9a8918c5 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -290,7 +290,7 @@ use sp_std::{ }; use codec::{HasCompact, Encode, Decode}; use frame_support::{ - decl_module, decl_event, decl_storage, ensure, decl_error, debug, + decl_module, decl_event, decl_storage, ensure, decl_error, weights::{Weight, constants::{WEIGHT_PER_MICROS, WEIGHT_PER_NANOS}}, storage::IterableStorageMap, dispatch::{IsSubType, DispatchResult, DispatchResultWithPostInfo, WithPostDispatchInfo}, @@ -332,13 +332,14 @@ const STAKING_ID: LockIdentifier = *b"staking "; pub const MAX_UNLOCKING_CHUNKS: usize = 32; pub const MAX_NOMINATIONS: usize = ::LIMIT; -// syntactic sugar for logging -#[cfg(feature = "std")] -const LOG_TARGET: &'static str = "staking"; +pub(crate) const LOG_TARGET: &'static str = "staking"; + +// syntactic sugar for logging. +#[macro_export] macro_rules! log { ($level:tt, $patter:expr $(, $values:expr)* $(,)?) => { - debug::native::$level!( - target: LOG_TARGET, + frame_support::debug::$level!( + target: crate::LOG_TARGET, $patter $(, $values)* ) }; @@ -372,7 +373,7 @@ generate_compact_solution_type!(pub GenericCompactAssignments, 16); pub struct ActiveEraInfo { /// Index of era. pub index: EraIndex, - /// Moment of start expresed as millisecond from `$UNIX_EPOCH`. + /// Moment of start expressed as millisecond from `$UNIX_EPOCH`. /// /// Start can be none if start hasn't been set for the era yet, /// Start is set on the first on_finalize of the era to guarantee usage of `Time`. @@ -1172,6 +1173,8 @@ decl_event!( OldSlashingReportDiscarded(SessionIndex), /// A new set of stakers was elected with the given computation method. StakingElection(ElectionCompute), + /// A new solution for the upcoming election has been stored. + SolutionStored(ElectionCompute), /// An account has bonded this amount. /// /// NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, @@ -1327,7 +1330,7 @@ decl_module! { log!(debug, "skipping offchain worker in open election window due to [{}]", why); } else { if let Err(e) = compute_offchain_election::() { - log!(warn, "💸 Error in phragmen offchain worker: {:?}", e); + log!(error, "💸 Error in phragmen offchain worker: {:?}", e); } else { log!(debug, "Executed offchain worker thread without errors."); } @@ -2788,6 +2791,9 @@ impl Module { }); QueuedScore::put(submitted_score); + // emit event. + Self::deposit_event(RawEvent::SolutionStored(compute)); + Ok(Some(adjusted_weight).into()) } diff --git a/frame/staking/src/offchain_election.rs b/frame/staking/src/offchain_election.rs index d93b5b2b27..ce9b77aef7 100644 --- a/frame/staking/src/offchain_election.rs +++ b/frame/staking/src/offchain_election.rs @@ -29,7 +29,7 @@ use sp_phragmen::{ }; use sp_runtime::offchain::storage::StorageValueRef; use sp_runtime::{PerThing, RuntimeDebug, traits::{TrailingZeroInput, Zero}}; -use frame_support::{debug, traits::Get}; +use frame_support::traits::Get; use sp_std::{convert::TryInto, prelude::*}; /// Error types related to the offchain election machinery. @@ -249,8 +249,8 @@ pub fn prepare_submission( nominators: snapshot_nominators.len() as NominatorIndex, }; - debug::native::debug!( - target: "staking", + crate::log!( + info, "prepared solution after {} equalization iterations with score {:?}", iterations_executed, score, diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 12ae71c1cd..f43c6383ea 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -3031,6 +3031,21 @@ mod offchain_phragmen { let queued_result = Staking::queued_elected().unwrap(); assert_eq!(queued_result.compute, ElectionCompute::Signed); + assert_eq!( + System::events() + .into_iter() + .map(|r| r.event) + .filter_map(|e| { + if let MetaEvent::staking(inner) = e { + Some(inner) + } else { + None + } + }) + .last() + .unwrap(), + RawEvent::SolutionStored(ElectionCompute::Signed), + ); run_to_block(15); assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); -- GitLab From df30fd4b26c9b1e00a08cd16fcbdc8772d8459d9 Mon Sep 17 00:00:00 2001 From: Sergei Pepyakin Date: Mon, 25 May 2020 17:25:57 +0200 Subject: [PATCH 114/150] Tidy tests a bit. (#6122) --- .../{tests => fixtures}/caller_contract.wat | 0 .../check_default_rent_allowance.wat | 0 .../{tests => fixtures}/crypto_hashes.wat | 0 .../destroy_and_transfer.wat | 0 .../{tests => fixtures}/dispatch_call.wat | 0 .../dispatch_call_then_trap.wat | 0 frame/contracts/{tests => fixtures}/drain.wat | 0 .../get_runtime_storage.wat | 0 .../{tests => fixtures}/restoration.wat | 0 .../return_from_start_fn.wat | 0 .../{tests => fixtures}/return_with_data.wat | 0 .../{tests => fixtures}/run_out_of_gas.wat | 0 .../{tests => fixtures}/self_destruct.wat | 0 .../self_destructing_constructor.wat | 0 .../{tests => fixtures}/set_rent.wat | 0 .../{tests => fixtures}/storage_size.wat | 0 frame/contracts/src/tests.rs | 2276 +++++++++-------- 17 files changed, 1193 insertions(+), 1083 deletions(-) rename frame/contracts/{tests => fixtures}/caller_contract.wat (100%) rename frame/contracts/{tests => fixtures}/check_default_rent_allowance.wat (100%) rename frame/contracts/{tests => fixtures}/crypto_hashes.wat (100%) rename frame/contracts/{tests => fixtures}/destroy_and_transfer.wat (100%) rename frame/contracts/{tests => fixtures}/dispatch_call.wat (100%) rename frame/contracts/{tests => fixtures}/dispatch_call_then_trap.wat (100%) rename frame/contracts/{tests => fixtures}/drain.wat (100%) rename frame/contracts/{tests => fixtures}/get_runtime_storage.wat (100%) rename frame/contracts/{tests => fixtures}/restoration.wat (100%) rename frame/contracts/{tests => fixtures}/return_from_start_fn.wat (100%) rename frame/contracts/{tests => fixtures}/return_with_data.wat (100%) rename frame/contracts/{tests => fixtures}/run_out_of_gas.wat (100%) rename frame/contracts/{tests => fixtures}/self_destruct.wat (100%) rename frame/contracts/{tests => fixtures}/self_destructing_constructor.wat (100%) rename frame/contracts/{tests => fixtures}/set_rent.wat (100%) rename frame/contracts/{tests => fixtures}/storage_size.wat (100%) diff --git a/frame/contracts/tests/caller_contract.wat b/frame/contracts/fixtures/caller_contract.wat similarity index 100% rename from frame/contracts/tests/caller_contract.wat rename to frame/contracts/fixtures/caller_contract.wat diff --git a/frame/contracts/tests/check_default_rent_allowance.wat b/frame/contracts/fixtures/check_default_rent_allowance.wat similarity index 100% rename from frame/contracts/tests/check_default_rent_allowance.wat rename to frame/contracts/fixtures/check_default_rent_allowance.wat diff --git a/frame/contracts/tests/crypto_hashes.wat b/frame/contracts/fixtures/crypto_hashes.wat similarity index 100% rename from frame/contracts/tests/crypto_hashes.wat rename to frame/contracts/fixtures/crypto_hashes.wat diff --git a/frame/contracts/tests/destroy_and_transfer.wat b/frame/contracts/fixtures/destroy_and_transfer.wat similarity index 100% rename from frame/contracts/tests/destroy_and_transfer.wat rename to frame/contracts/fixtures/destroy_and_transfer.wat diff --git a/frame/contracts/tests/dispatch_call.wat b/frame/contracts/fixtures/dispatch_call.wat similarity index 100% rename from frame/contracts/tests/dispatch_call.wat rename to frame/contracts/fixtures/dispatch_call.wat diff --git a/frame/contracts/tests/dispatch_call_then_trap.wat b/frame/contracts/fixtures/dispatch_call_then_trap.wat similarity index 100% rename from frame/contracts/tests/dispatch_call_then_trap.wat rename to frame/contracts/fixtures/dispatch_call_then_trap.wat diff --git a/frame/contracts/tests/drain.wat b/frame/contracts/fixtures/drain.wat similarity index 100% rename from frame/contracts/tests/drain.wat rename to frame/contracts/fixtures/drain.wat diff --git a/frame/contracts/tests/get_runtime_storage.wat b/frame/contracts/fixtures/get_runtime_storage.wat similarity index 100% rename from frame/contracts/tests/get_runtime_storage.wat rename to frame/contracts/fixtures/get_runtime_storage.wat diff --git a/frame/contracts/tests/restoration.wat b/frame/contracts/fixtures/restoration.wat similarity index 100% rename from frame/contracts/tests/restoration.wat rename to frame/contracts/fixtures/restoration.wat diff --git a/frame/contracts/tests/return_from_start_fn.wat b/frame/contracts/fixtures/return_from_start_fn.wat similarity index 100% rename from frame/contracts/tests/return_from_start_fn.wat rename to frame/contracts/fixtures/return_from_start_fn.wat diff --git a/frame/contracts/tests/return_with_data.wat b/frame/contracts/fixtures/return_with_data.wat similarity index 100% rename from frame/contracts/tests/return_with_data.wat rename to frame/contracts/fixtures/return_with_data.wat diff --git a/frame/contracts/tests/run_out_of_gas.wat b/frame/contracts/fixtures/run_out_of_gas.wat similarity index 100% rename from frame/contracts/tests/run_out_of_gas.wat rename to frame/contracts/fixtures/run_out_of_gas.wat diff --git a/frame/contracts/tests/self_destruct.wat b/frame/contracts/fixtures/self_destruct.wat similarity index 100% rename from frame/contracts/tests/self_destruct.wat rename to frame/contracts/fixtures/self_destruct.wat diff --git a/frame/contracts/tests/self_destructing_constructor.wat b/frame/contracts/fixtures/self_destructing_constructor.wat similarity index 100% rename from frame/contracts/tests/self_destructing_constructor.wat rename to frame/contracts/fixtures/self_destructing_constructor.wat diff --git a/frame/contracts/tests/set_rent.wat b/frame/contracts/fixtures/set_rent.wat similarity index 100% rename from frame/contracts/tests/set_rent.wat rename to frame/contracts/fixtures/set_rent.wat diff --git a/frame/contracts/tests/storage_size.wat b/frame/contracts/fixtures/storage_size.wat similarity index 100% rename from frame/contracts/tests/storage_size.wat rename to frame/contracts/fixtures/storage_size.wat diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 23c0417dac..944bca622b 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -14,33 +14,27 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -// TODO: #1417 Add more integration tests -// also remove the #![allow(unused)] below. - -#![allow(unused)] - use crate::{ - BalanceOf, ComputeDispatchFee, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, - Module, RawAliveContractInfo, RawEvent, Trait, TrieId, TrieIdFromParentCounter, Schedule, - TrieIdGenerator, account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}, + BalanceOf, ContractAddressFor, ContractInfo, ContractInfoOf, GenesisConfig, Module, + RawAliveContractInfo, RawEvent, Trait, TrieId, Schedule, TrieIdGenerator, + account_db::{AccountDb, DirectAccountDb, OverlayAccountDb}, gas::Gas, }; use assert_matches::assert_matches; use hex_literal::*; -use codec::{Decode, Encode, KeyedVec}; +use codec::Encode; use sp_runtime::{ - Perbill, BuildStorage, transaction_validity::{InvalidTransaction, ValidTransaction}, - traits::{BlakeTwo256, Hash, IdentityLookup, SignedExtension, Convert}, - testing::{Digest, DigestItem, Header, UintAuthorityId, H256}, + Perbill, + traits::{BlakeTwo256, Hash, IdentityLookup, Convert}, + testing::{Header, H256}, }; use frame_support::{ - assert_ok, assert_err, assert_err_ignore_postinfo, impl_outer_dispatch, impl_outer_event, - impl_outer_origin, parameter_types, - storage::child, StorageMap, StorageValue, traits::{Currency, Get}, - weights::{DispatchInfo, DispatchClass, Weight, PostDispatchInfo, Pays, IdentityFee}, + assert_ok, assert_err_ignore_postinfo, impl_outer_dispatch, impl_outer_event, + impl_outer_origin, parameter_types, StorageMap, StorageValue, + traits::{Currency, Get}, + weights::{Weight, PostDispatchInfo, IdentityFee}, }; -use std::{cell::RefCell, sync::atomic::{AtomicUsize, Ordering}}; -use sp_core::storage::well_known_keys; +use std::cell::RefCell; use frame_system::{self as system, EventRecord, Phase}; mod contracts { @@ -48,7 +42,7 @@ mod contracts { // needs to give a name for the current crate. // This hack is required for `impl_outer_event!`. pub use super::super::*; - use frame_support::impl_outer_event; + pub use frame_support::impl_outer_event; } use pallet_balances as balances; @@ -190,8 +184,6 @@ impl ContractAddressFor for DummyContractAddressFor { pub struct DummyTrieIdGenerator; impl TrieIdGenerator for DummyTrieIdGenerator { fn trie_id(account_id: &u64) -> TrieId { - use sp_core::storage::well_known_keys; - let new_seed = super::AccountCounter::mutate(|v| { *v = v.wrapping_add(1); *v @@ -204,13 +196,6 @@ impl TrieIdGenerator for DummyTrieIdGenerator { } } -pub struct DummyComputeDispatchFee; -impl ComputeDispatchFee for DummyComputeDispatchFee { - fn compute_dispatch_fee(call: &Call) -> u64 { - 69 - } -} - const ALICE: u64 = 1; const BOB: u64 = 2; const CHARLIE: u64 = 3; @@ -254,14 +239,24 @@ impl ExtBuilder { } } -/// Generate Wasm binary and code hash from wabt source. -fn compile_module(wabt_module: &str) - -> Result<(Vec, ::Output), wabt::Error> - where T: frame_system::Trait +/// Load a given wasm module represented by a .wat file and returns a wasm binary contents along +/// with it's hash. +/// +/// The fixture files are located under the `fixtures/` directory. +fn compile_module( + fixture_name: &str, +) -> Result<(Vec, ::Output), wabt::Error> +where + T: frame_system::Trait, { - let wasm = wabt::wat2wasm(wabt_module)?; - let code_hash = T::Hashing::hash(&wasm); - Ok((wasm, code_hash)) + use std::fs; + + let fixture_path = ["fixtures/", fixture_name, ".wat"].concat(); + let module_wat_source = + fs::read_to_string(&fixture_path).expect(&format!("Unable to find {} fixture", fixture_name)); + let wasm_binary = wabt::wat2wasm(module_wat_source)?; + let code_hash = T::Hashing::hash(&wasm_binary); + Ok((wasm_binary, code_hash)) } // Perform a simple transfer to a non-existent account. @@ -269,7 +264,7 @@ fn compile_module(wabt_module: &str) #[test] fn returns_base_call_cost() { ExtBuilder::default().build().execute_with(|| { - Balances::deposit_creating(&ALICE, 100_000_000); + let _ = Balances::deposit_creating(&ALICE, 100_000_000); assert_eq!( Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, Vec::new()), @@ -292,7 +287,7 @@ fn account_removal_does_not_remove_storage() { // Set up two accounts with free balance above the existential threshold. { - Balances::deposit_creating(&1, 110); + let _ = Balances::deposit_creating(&1, 110); ContractInfoOf::::insert(1, &ContractInfo::Alive(RawAliveContractInfo { trie_id: trie_id1.clone(), storage_size: ::StorageSizeOffset::get(), @@ -307,7 +302,7 @@ fn account_removal_does_not_remove_storage() { overlay.set_storage(&1, key2.clone(), Some(b"2".to_vec())); DirectAccountDb.commit(overlay.into_change_set()); - Balances::deposit_creating(&2, 110); + let _ = Balances::deposit_creating(&2, 110); ContractInfoOf::::insert(2, &ContractInfo::Alive(RawAliveContractInfo { trie_id: trie_id2.clone(), storage_size: ::StorageSizeOffset::get(), @@ -357,71 +352,73 @@ fn account_removal_does_not_remove_storage() { #[test] fn instantiate_and_call_and_deposit_event() { - let (wasm, code_hash) = compile_module::(&load_wasm("return_from_start_fn.wat")) - .unwrap(); + let (wasm, code_hash) = compile_module::("return_from_start_fn").unwrap(); - ExtBuilder::default().existential_deposit(100).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); + ExtBuilder::default() + .existential_deposit(100) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // Check at the end to get hash on error easily - let creation = Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, - code_hash.into(), - vec![], - ); + // Check at the end to get hash on error easily + let creation = Contracts::instantiate( + Origin::signed(ALICE), + 100, + GAS_LIMIT, + code_hash.into(), + vec![], + ); - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(BOB)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances( - pallet_balances::RawEvent::Endowed(BOB, 100) - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Transfer(ALICE, BOB, 100)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::ContractExecution(BOB, vec![1, 2, 3, 4])), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Instantiated(ALICE, BOB)), - topics: vec![], - } - ]); + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(BOB)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances( + pallet_balances::RawEvent::Endowed(BOB, 100) + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::ContractExecution(BOB, vec![1, 2, 3, 4])), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], + } + ]); - assert_ok!(creation); - assert!(ContractInfoOf::::contains_key(BOB)); - }); + assert_ok!(creation); + assert!(ContractInfoOf::::contains_key(BOB)); + }); } #[test] @@ -431,118 +428,120 @@ fn dispatch_call() { let encoded = Encode::encode(&Call::Balances(pallet_balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); - let (wasm, code_hash) = compile_module::(&load_wasm("dispatch_call.wat")) - .unwrap(); + let (wasm, code_hash) = compile_module::("dispatch_call").unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // Let's keep this assert even though it's redundant. If you ever need to update the - // wasm source this test will fail and will show you the actual hash. - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), - topics: vec![], - }, - ]); - - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - assert_ok!(Contracts::call( - Origin::signed(ALICE), - BOB, // newly created account - 0, - GAS_LIMIT, - vec![], - )); - - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(BOB)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances( - pallet_balances::RawEvent::Endowed(BOB, 100) - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Transfer(ALICE, BOB, 100)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Instantiated(ALICE, BOB)), - topics: vec![], - }, + // Let's keep this assert even though it's redundant. If you ever need to update the + // wasm source this test will fail and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), + topics: vec![], + }, + ]); - // Dispatching the call. - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(CHARLIE)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances( - pallet_balances::RawEvent::Endowed(CHARLIE, 50) - ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances( - pallet_balances::RawEvent::Transfer(BOB, CHARLIE, 50) - ), - topics: vec![], - }, + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100, + GAS_LIMIT, + code_hash.into(), + vec![], + )); - // Event emitted as a result of dispatch. - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Dispatched(BOB, true)), - topics: vec![], - } - ]); - }); + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, // newly created account + 0, + GAS_LIMIT, + vec![], + )); + + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(BOB)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances( + pallet_balances::RawEvent::Endowed(BOB, 100) + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], + }, + + // Dispatching the call. + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(CHARLIE)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances( + pallet_balances::RawEvent::Endowed(CHARLIE, 50) + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances( + pallet_balances::RawEvent::Transfer(BOB, CHARLIE, 50) + ), + topics: vec![], + }, + + // Event emitted as a result of dispatch. + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Dispatched(BOB, true)), + topics: vec![], + } + ]); + }); } #[test] @@ -552,107 +551,108 @@ fn dispatch_call_not_dispatched_after_top_level_transaction_failure() { let encoded = Encode::encode(&Call::Balances(pallet_balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); - let (wasm, code_hash) = compile_module::(&load_wasm("dispatch_call_then_trap.wat")) - .unwrap(); + let (wasm, code_hash) = compile_module::("dispatch_call_then_trap").unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // Let's keep this assert even though it's redundant. If you ever need to update the - // wasm source this test will fail and will show you the actual hash. - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), - topics: vec![], - }, - ]); - - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - // Call the newly instantiated contract. The contract is expected to dispatch a call - // and then trap. - assert_err_ignore_postinfo!( - Contracts::call( + // Let's keep this assert even though it's redundant. If you ever need to update the + // wasm source this test will fail and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), + topics: vec![], + }, + ]); + + assert_ok!(Contracts::instantiate( Origin::signed(ALICE), - BOB, // newly created account - 0, + 100, GAS_LIMIT, + code_hash.into(), vec![], - ), - "contract trapped during execution" - ); - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(BOB)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances( - pallet_balances::RawEvent::Endowed(BOB, 100) + )); + + // Call the newly instantiated contract. The contract is expected to dispatch a call + // and then trap. + assert_err_ignore_postinfo!( + Contracts::call( + Origin::signed(ALICE), + BOB, // newly created account + 0, + GAS_LIMIT, + vec![], ), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Transfer(ALICE, BOB, 100)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Instantiated(ALICE, BOB)), - topics: vec![], - }, - // ABSENCE of events which would be caused by dispatched Balances::transfer call - ]); - }); + "contract trapped during execution" + ); + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(BOB)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances( + pallet_balances::RawEvent::Endowed(BOB, 100) + ), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Transfer(ALICE, BOB, 100)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Instantiated(ALICE, BOB)), + topics: vec![], + }, + // ABSENCE of events which would be caused by dispatched Balances::transfer call + ]); + }); } #[test] fn run_out_of_gas() { - let (wasm, code_hash) = compile_module::(&load_wasm("run_out_of_gas.wat")) - .unwrap(); + let (wasm, code_hash) = compile_module::("run_out_of_gas").unwrap(); ExtBuilder::default() .existential_deposit(50) .build() .execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); + let _ = Balances::deposit_creating(&ALICE, 1_000_000); assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); @@ -696,60 +696,97 @@ fn test_set_rent_code_and_hash() { let encoded = Encode::encode(&Call::Balances(pallet_balances::Call::transfer(CHARLIE, 50))); assert_eq!(&encoded[..], &hex!("00000300000000000000C8")[..]); - let (wasm, code_hash) = compile_module::(&load_wasm("set_rent.wat")).unwrap(); + let (wasm, code_hash) = compile_module::("set_rent").unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // If you ever need to update the wasm source this test will fail - // and will show you the actual hash. - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), - topics: vec![], - }, - ]); - }); -} + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(code_hash.into())), + topics: vec![], + }, + ]); + }); +} #[test] fn storage_size() { - let (wasm, code_hash) = compile_module::(&load_wasm("set_rent.wat")).unwrap(); + let (wasm, code_hash) = compile_module::("set_rent").unwrap(); // Storage size - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 30_000, - GAS_LIMIT, code_hash.into(), - ::Balance::from(1_000u32).encode() // rent allowance - )); - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.storage_size, ::StorageSizeOffset::get() + 4); - - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::set_storage_4_byte())); - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.storage_size, ::StorageSizeOffset::get() + 4 + 4); - - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::remove_storage_4_byte())); - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.storage_size, ::StorageSizeOffset::get() + 4); - }); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 30_000, + GAS_LIMIT, + code_hash.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + let bob_contract = ContractInfoOf::::get(BOB) + .unwrap() + .get_alive() + .unwrap(); + assert_eq!( + bob_contract.storage_size, + ::StorageSizeOffset::get() + 4 + ); + + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + call::set_storage_4_byte() + )); + let bob_contract = ContractInfoOf::::get(BOB) + .unwrap() + .get_alive() + .unwrap(); + assert_eq!( + bob_contract.storage_size, + ::StorageSizeOffset::get() + 4 + 4 + ); + + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + call::remove_storage_4_byte() + )); + let bob_contract = ContractInfoOf::::get(BOB) + .unwrap() + .get_alive() + .unwrap(); + assert_eq!( + bob_contract.storage_size, + ::StorageSizeOffset::get() + 4 + ); + }); } fn initialize_block(number: u64) { @@ -764,68 +801,71 @@ fn initialize_block(number: u64) { #[test] fn deduct_blocks() { - let (wasm, code_hash) = compile_module::(&load_wasm("set_rent.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 30_000, - GAS_LIMIT, code_hash.into(), - ::Balance::from(1_000u32).encode() // rent allowance - )); - - // Check creation - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, 1_000); - - // Advance 4 blocks - initialize_block(5); - - // Trigger rent through call - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); - - // Check result - let rent = (8 + 4 - 3) // storage size = size_offset + deploy_set_storage - deposit_offset - * 4 // rent byte price - * 4; // blocks to rent - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, 1_000 - rent); - assert_eq!(bob_contract.deduct_block, 5); - assert_eq!(Balances::free_balance(BOB), 30_000 - rent); - - // Advance 7 blocks more - initialize_block(12); - - // Trigger rent through call - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); - - // Check result - let rent_2 = (8 + 4 - 2) // storage size = size_offset + deploy_set_storage - deposit_offset - * 4 // rent byte price - * 7; // blocks to rent - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); - assert_eq!(bob_contract.deduct_block, 12); - assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); - - // Second call on same block should have no effect on rent - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); - - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); - assert_eq!(bob_contract.deduct_block, 12); - assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); - }); + let (wasm, code_hash) = compile_module::("set_rent").unwrap(); + + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 30_000, + GAS_LIMIT, code_hash.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000); + + // Advance 4 blocks + initialize_block(5); + + // Trigger rent through call + assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); + + // Check result + let rent = (8 + 4 - 3) // storage size = size_offset + deploy_set_storage - deposit_offset + * 4 // rent byte price + * 4; // blocks to rent + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent); + assert_eq!(bob_contract.deduct_block, 5); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent); + + // Advance 7 blocks more + initialize_block(12); + + // Trigger rent through call + assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); + + // Check result + let rent_2 = (8 + 4 - 2) // storage size = size_offset + deploy_set_storage - deposit_offset + * 4 // rent byte price + * 7; // blocks to rent + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); + assert_eq!(bob_contract.deduct_block, 12); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); + + // Second call on same block should have no effect on rent + assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); + + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 1_000 - rent - rent_2); + assert_eq!(bob_contract.deduct_block, 12); + assert_eq!(Balances::free_balance(BOB), 30_000 - rent - rent_2); + }); } #[test] fn call_contract_removals() { removals(|| { // Call on already-removed account might fail, and this is fine. - Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()); + let _ = Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()); true }); } @@ -858,31 +898,34 @@ fn claim_surcharge_malus() { /// Claim surcharge with the given trigger_call at the given blocks. /// If `removes` is true then assert that the contract is a tombstone. fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) { - let (wasm, code_hash) = compile_module::(&load_wasm("set_rent.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, code_hash.into(), - ::Balance::from(1_000u32).encode() // rent allowance - )); - - // Advance blocks - initialize_block(blocks); - - // Trigger rent through call - assert!(trigger_call()); - - if removes { - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - } else { - assert!(ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); - } - }); + let (wasm, code_hash) = compile_module::("set_rent").unwrap(); + + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100, + GAS_LIMIT, code_hash.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Advance blocks + initialize_block(blocks); + + // Trigger rent through call + assert!(trigger_call()); + + if removes { + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + } else { + assert!(ContractInfoOf::::get(BOB).unwrap().get_alive().is_some()); + } + }); } /// Test for all kind of removals for the given trigger: @@ -890,194 +933,246 @@ fn claim_surcharge(blocks: u64, trigger_call: impl Fn() -> bool, removes: bool) /// * if allowance is exceeded /// * if balance is reached and balance < subsistence threshold fn removals(trigger_call: impl Fn() -> bool) { - let (wasm, code_hash) = compile_module::(&load_wasm("set_rent.wat")).unwrap(); + let (wasm, code_hash) = compile_module::("set_rent").unwrap(); // Balance reached and superior to subsistence threshold - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, code_hash.into(), - ::Balance::from(1_000u32).encode() // rent allowance - )); - - let subsistence_threshold = 50 /*existential_deposit*/ + 16 /*tombstone_deposit*/; - - // Trigger rent must have no effect - assert!(trigger_call()); - assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); - assert_eq!(Balances::free_balance(BOB), 100); - - // Advance blocks - initialize_block(10); - - // Trigger rent through call - assert!(trigger_call()); - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(Balances::free_balance(BOB), subsistence_threshold); - - // Advance blocks - initialize_block(20); - - // Trigger rent must have no effect - assert!(trigger_call()); - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(Balances::free_balance(BOB), subsistence_threshold); - }); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100, + GAS_LIMIT, code_hash.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + let subsistence_threshold = 50 /*existential_deposit*/ + 16 /*tombstone_deposit*/; + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); + assert_eq!(Balances::free_balance(BOB), 100); + + // Advance blocks + initialize_block(10); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert_eq!(Balances::free_balance(BOB), subsistence_threshold); + + // Advance blocks + initialize_block(20); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert_eq!(Balances::free_balance(BOB), subsistence_threshold); + }); // Allowance exceeded - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 1_000, - GAS_LIMIT, code_hash.into(), - ::Balance::from(100u32).encode() // rent allowance - )); - - // Trigger rent must have no effect - assert!(trigger_call()); - assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 100); - assert_eq!(Balances::free_balance(BOB), 1_000); - - // Advance blocks - initialize_block(10); - - // Trigger rent through call - assert!(trigger_call()); - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - // Balance should be initial balance - initial rent_allowance - assert_eq!(Balances::free_balance(BOB), 900); - - // Advance blocks - initialize_block(20); - - // Trigger rent must have no effect - assert!(trigger_call()); - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(Balances::free_balance(BOB), 900); - }); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 1_000, + GAS_LIMIT, + code_hash.into(), + ::Balance::from(100u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!( + ContractInfoOf::::get(BOB) + .unwrap() + .get_alive() + .unwrap() + .rent_allowance, + 100 + ); + assert_eq!(Balances::free_balance(BOB), 1_000); + + // Advance blocks + initialize_block(10); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB) + .unwrap() + .get_tombstone() + .is_some()); + // Balance should be initial balance - initial rent_allowance + assert_eq!(Balances::free_balance(BOB), 900); + + // Advance blocks + initialize_block(20); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB) + .unwrap() + .get_tombstone() + .is_some()); + assert_eq!(Balances::free_balance(BOB), 900); + }); // Balance reached and inferior to subsistence threshold - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 50+Balances::minimum_balance(), - GAS_LIMIT, code_hash.into(), - ::Balance::from(1_000u32).encode() // rent allowance - )); - - // Trigger rent must have no effect - assert!(trigger_call()); - assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); - assert_eq!(Balances::free_balance(BOB), 50 + Balances::minimum_balance()); - - // Transfer funds - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::transfer())); - assert_eq!(ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap().rent_allowance, 1_000); - assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); - - // Advance blocks - initialize_block(10); - - // Trigger rent through call - assert!(trigger_call()); - assert!(ContractInfoOf::::get(BOB).is_none()); - assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); - - // Advance blocks - initialize_block(20); - - // Trigger rent must have no effect - assert!(trigger_call()); - assert!(ContractInfoOf::::get(BOB).is_none()); - assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); - }); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 50 + Balances::minimum_balance(), + GAS_LIMIT, + code_hash.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert_eq!( + ContractInfoOf::::get(BOB) + .unwrap() + .get_alive() + .unwrap() + .rent_allowance, + 1_000 + ); + assert_eq!( + Balances::free_balance(BOB), + 50 + Balances::minimum_balance() + ); + + // Transfer funds + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + call::transfer() + )); + assert_eq!( + ContractInfoOf::::get(BOB) + .unwrap() + .get_alive() + .unwrap() + .rent_allowance, + 1_000 + ); + assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); + + // Advance blocks + initialize_block(10); + + // Trigger rent through call + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).is_none()); + assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); + + // Advance blocks + initialize_block(20); + + // Trigger rent must have no effect + assert!(trigger_call()); + assert!(ContractInfoOf::::get(BOB).is_none()); + assert_eq!(Balances::free_balance(BOB), Balances::minimum_balance()); + }); } #[test] fn call_removed_contract() { - let (wasm, code_hash) = compile_module::(&load_wasm("set_rent.wat")).unwrap(); + let (wasm, code_hash) = compile_module::("set_rent").unwrap(); // Balance reached and superior to subsistence threshold - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, code_hash.into(), - ::Balance::from(1_000u32).encode() // rent allowance - )); - - // Calling contract should succeed. - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); - - // Advance blocks - initialize_block(10); - - // Calling contract should remove contract and fail. - assert_err_ignore_postinfo!( - Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()), - "contract has been evicted" - ); - // Calling a contract that is about to evict shall emit an event. - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Evicted(BOB, true)), - topics: vec![], - }, - ]); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm.clone())); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100, + GAS_LIMIT, code_hash.into(), + ::Balance::from(1_000u32).encode() // rent allowance + )); - // Subsequent contract calls should also fail. - assert_err_ignore_postinfo!( - Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()), - "contract has been evicted" - ); - }) + // Calling contract should succeed. + assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); + + // Advance blocks + initialize_block(10); + + // Calling contract should remove contract and fail. + assert_err_ignore_postinfo!( + Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()), + "contract has been evicted" + ); + // Calling a contract that is about to evict shall emit an event. + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Evicted(BOB, true)), + topics: vec![], + }, + ]); + + // Subsequent contract calls should also fail. + assert_err_ignore_postinfo!( + Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()), + "contract has been evicted" + ); + }) } #[test] fn default_rent_allowance_on_instantiate() { - let (wasm, code_hash) = compile_module::( - &load_wasm("check_default_rent_allowance.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 30_000, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - // Check creation - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, >::max_value()); - - // Advance blocks - initialize_block(5); - - // Trigger rent through call - assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); - - // Check contract is still alive - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive(); - assert!(bob_contract.is_some()) - }); + let (wasm, code_hash) = compile_module::("check_default_rent_allowance").unwrap(); + + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 30_000, + GAS_LIMIT, + code_hash.into(), + vec![], + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, >::max_value()); + + // Advance blocks + initialize_block(5); + + // Trigger rent through call + assert_ok!(Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null())); + + // Check contract is still alive + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive(); + assert!(bob_contract.is_some()) + }); } #[test] @@ -1101,571 +1196,586 @@ fn restoration_success() { } fn restoration(test_different_storage: bool, test_restore_to_with_dirty_storage: bool) { - let (set_rent_wasm, set_rent_code_hash) = - compile_module::(&load_wasm("set_rent.wat")).unwrap(); - let (restoration_wasm, restoration_code_hash) = - compile_module::(&load_wasm("restoration.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), restoration_wasm)); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), set_rent_wasm)); - - // If you ever need to update the wasm source this test will fail - // and will show you the actual hash. - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(restoration_code_hash.into())), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::CodeStored(set_rent_code_hash.into())), - topics: vec![], - }, - ]); - - // Create an account with address `BOB` with code `CODE_SET_RENT`. - // The input parameter sets the rent allowance to 0. - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 30_000, - GAS_LIMIT, - set_rent_code_hash.into(), - ::Balance::from(0u32).encode() - )); - - // Check if `BOB` was created successfully and that the rent allowance is - // set to 0. - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, 0); - - if test_different_storage { - assert_ok!(Contracts::call( - Origin::signed(ALICE), - BOB, 0, GAS_LIMIT, - call::set_storage_4_byte()) - ); - } + let (set_rent_wasm, set_rent_code_hash) = compile_module::("set_rent").unwrap(); + let (restoration_wasm, restoration_code_hash) = compile_module::("restoration").unwrap(); - // Advance 4 blocks, to the 5th. - initialize_block(5); - - /// Preserve `BOB`'s code hash for later introspection. - let bob_code_hash = ContractInfoOf::::get(BOB).unwrap() - .get_alive().unwrap().code_hash; - // Call `BOB`, which makes it pay rent. Since the rent allowance is set to 0 - // we expect that it will get removed leaving tombstone. - assert_err_ignore_postinfo!( - Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()), - "contract has been evicted" - ); - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts( - RawEvent::Evicted(BOB.clone(), true) - ), - topics: vec![], - }, - ]); - - /// Create another account with the address `DJANGO` with `CODE_RESTORATION`. - /// - /// Note that we can't use `ALICE` for creating `DJANGO` so we create yet another - /// account `CHARLIE` and create `DJANGO` with it. - Balances::deposit_creating(&CHARLIE, 1_000_000); - assert_ok!(Contracts::instantiate( - Origin::signed(CHARLIE), - 30_000, - GAS_LIMIT, - restoration_code_hash.into(), - ::Balance::from(0u32).encode() - )); - - // Before performing a call to `DJANGO` save its original trie id. - let django_trie_id = ContractInfoOf::::get(DJANGO).unwrap() - .get_alive().unwrap().trie_id; - - if !test_restore_to_with_dirty_storage { - // Advance 1 block, to the 6th. - initialize_block(6); - } + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), restoration_wasm)); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), set_rent_wasm)); - // Perform a call to `DJANGO`. This should either perform restoration successfully or - // fail depending on the test parameters. - assert_ok!(Contracts::call( - Origin::signed(ALICE), - DJANGO, - 0, - GAS_LIMIT, - vec![], - )); - - if test_different_storage || test_restore_to_with_dirty_storage { - // Parametrization of the test imply restoration failure. Check that `DJANGO` aka - // restoration contract is still in place and also that `BOB` doesn't exist. - assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); - let django_contract = ContractInfoOf::::get(DJANGO).unwrap() - .get_alive().unwrap(); - assert_eq!(django_contract.storage_size, 16); - assert_eq!(django_contract.trie_id, django_trie_id); - assert_eq!(django_contract.deduct_block, System::block_number()); - match (test_different_storage, test_restore_to_with_dirty_storage) { - (true, false) => { - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts( - RawEvent::Restored(DJANGO, BOB, bob_code_hash, 50, false) - ), - topics: vec![], - }, - ]); - } - (_, true) => { - assert_eq!(System::events(), vec![ - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Evicted(BOB, true)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(CHARLIE)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(CHARLIE, 1_000_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::system(frame_system::RawEvent::NewAccount(DJANGO)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(DJANGO, 30_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Transfer(CHARLIE, DJANGO, 30_000)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Instantiated(CHARLIE, DJANGO)), - topics: vec![], - }, - EventRecord { - phase: Phase::Initialization, - event: MetaEvent::contracts(RawEvent::Restored( - DJANGO, - BOB, - bob_code_hash, - 50, - false, - )), - topics: vec![], - }, - ]); - } - _ => unreachable!(), - } - } else { - // Here we expect that the restoration is succeeded. Check that the restoration - // contract `DJANGO` ceased to exist and that `BOB` returned back. - println!("{:?}", ContractInfoOf::::get(BOB)); - let bob_contract = ContractInfoOf::::get(BOB).unwrap() - .get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, 50); - assert_eq!(bob_contract.storage_size, 12); - assert_eq!(bob_contract.trie_id, django_trie_id); - assert_eq!(bob_contract.deduct_block, System::block_number()); - assert!(ContractInfoOf::::get(DJANGO).is_none()); + // If you ever need to update the wasm source this test will fail + // and will show you the actual hash. assert_eq!(System::events(), vec![ EventRecord { phase: Phase::Initialization, - event: MetaEvent::system(system::RawEvent::KilledAccount(DJANGO)), + event: MetaEvent::system(frame_system::RawEvent::NewAccount(1)), topics: vec![], }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(1, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(restoration_code_hash.into())), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::CodeStored(set_rent_code_hash.into())), + topics: vec![], + }, + ]); + + // Create an account with address `BOB` with code `CODE_SET_RENT`. + // The input parameter sets the rent allowance to 0. + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 30_000, + GAS_LIMIT, + set_rent_code_hash.into(), + ::Balance::from(0u32).encode() + )); + + // Check if `BOB` was created successfully and that the rent allowance is + // set to 0. + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 0); + + if test_different_storage { + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, 0, GAS_LIMIT, + call::set_storage_4_byte()) + ); + } + + // Advance 4 blocks, to the 5th. + initialize_block(5); + + // Preserve `BOB`'s code hash for later introspection. + let bob_code_hash = ContractInfoOf::::get(BOB).unwrap() + .get_alive().unwrap().code_hash; + // Call `BOB`, which makes it pay rent. Since the rent allowance is set to 0 + // we expect that it will get removed leaving tombstone. + assert_err_ignore_postinfo!( + Contracts::call(Origin::signed(ALICE), BOB, 0, GAS_LIMIT, call::null()), + "contract has been evicted" + ); + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + assert_eq!(System::events(), vec![ EventRecord { phase: Phase::Initialization, event: MetaEvent::contracts( - RawEvent::Restored(DJANGO, BOB, bob_contract.code_hash, 50, true) + RawEvent::Evicted(BOB.clone(), true) ), topics: vec![], }, ]); - } - }); + + // Create another account with the address `DJANGO` with `CODE_RESTORATION`. + // + // Note that we can't use `ALICE` for creating `DJANGO` so we create yet another + // account `CHARLIE` and create `DJANGO` with it. + let _ = Balances::deposit_creating(&CHARLIE, 1_000_000); + assert_ok!(Contracts::instantiate( + Origin::signed(CHARLIE), + 30_000, + GAS_LIMIT, + restoration_code_hash.into(), + ::Balance::from(0u32).encode() + )); + + // Before performing a call to `DJANGO` save its original trie id. + let django_trie_id = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap().trie_id; + + if !test_restore_to_with_dirty_storage { + // Advance 1 block, to the 6th. + initialize_block(6); + } + + // Perform a call to `DJANGO`. This should either perform restoration successfully or + // fail depending on the test parameters. + assert_ok!(Contracts::call( + Origin::signed(ALICE), + DJANGO, + 0, + GAS_LIMIT, + vec![], + )); + + if test_different_storage || test_restore_to_with_dirty_storage { + // Parametrization of the test imply restoration failure. Check that `DJANGO` aka + // restoration contract is still in place and also that `BOB` doesn't exist. + assert!(ContractInfoOf::::get(BOB).unwrap().get_tombstone().is_some()); + let django_contract = ContractInfoOf::::get(DJANGO).unwrap() + .get_alive().unwrap(); + assert_eq!(django_contract.storage_size, 16); + assert_eq!(django_contract.trie_id, django_trie_id); + assert_eq!(django_contract.deduct_block, System::block_number()); + match (test_different_storage, test_restore_to_with_dirty_storage) { + (true, false) => { + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts( + RawEvent::Restored(DJANGO, BOB, bob_code_hash, 50, false) + ), + topics: vec![], + }, + ]); + } + (_, true) => { + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Evicted(BOB, true)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(CHARLIE)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(CHARLIE, 1_000_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(frame_system::RawEvent::NewAccount(DJANGO)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::balances(pallet_balances::RawEvent::Endowed(DJANGO, 30_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Transfer(CHARLIE, DJANGO, 30_000)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Instantiated(CHARLIE, DJANGO)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts(RawEvent::Restored( + DJANGO, + BOB, + bob_code_hash, + 50, + false, + )), + topics: vec![], + }, + ]); + } + _ => unreachable!(), + } + } else { + // Here we expect that the restoration is succeeded. Check that the restoration + // contract `DJANGO` ceased to exist and that `BOB` returned back. + println!("{:?}", ContractInfoOf::::get(BOB)); + let bob_contract = ContractInfoOf::::get(BOB).unwrap() + .get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, 50); + assert_eq!(bob_contract.storage_size, 12); + assert_eq!(bob_contract.trie_id, django_trie_id); + assert_eq!(bob_contract.deduct_block, System::block_number()); + assert!(ContractInfoOf::::get(DJANGO).is_none()); + assert_eq!(System::events(), vec![ + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::system(system::RawEvent::KilledAccount(DJANGO)), + topics: vec![], + }, + EventRecord { + phase: Phase::Initialization, + event: MetaEvent::contracts( + RawEvent::Restored(DJANGO, BOB, bob_contract.code_hash, 50, true) + ), + topics: vec![], + }, + ]); + } + }); } #[test] fn storage_max_value_limit() { - let (wasm, code_hash) = compile_module::(&load_wasm("storage_size.wat")) - .unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 30_000, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - // Check creation - let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); - assert_eq!(bob_contract.rent_allowance, >::max_value()); - - // Call contract with allowed storage value. - assert_ok!(Contracts::call( - Origin::signed(ALICE), - BOB, - 0, - GAS_LIMIT, - Encode::encode(&self::MaxValueSize::get()), - )); - - // Call contract with too large a storage value. - assert_err_ignore_postinfo!( - Contracts::call( + let (wasm, code_hash) = compile_module::("storage_size").unwrap(); + + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 30_000, + GAS_LIMIT, + code_hash.into(), + vec![], + )); + + // Check creation + let bob_contract = ContractInfoOf::::get(BOB).unwrap().get_alive().unwrap(); + assert_eq!(bob_contract.rent_allowance, >::max_value()); + + // Call contract with allowed storage value. + assert_ok!(Contracts::call( Origin::signed(ALICE), BOB, 0, GAS_LIMIT, - Encode::encode(&(self::MaxValueSize::get() + 1)), - ), - "contract trapped during execution" - ); - }); + Encode::encode(&self::MaxValueSize::get()), + )); + + // Call contract with too large a storage value. + assert_err_ignore_postinfo!( + Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + Encode::encode(&(self::MaxValueSize::get() + 1)), + ), + "contract trapped during execution" + ); + }); } #[test] fn deploy_and_call_other_contract() { - let (callee_wasm, callee_code_hash) = - compile_module::(&load_wasm("return_with_data.wat")).unwrap(); - let (caller_wasm, caller_code_hash) = - compile_module::(&load_wasm("caller_contract.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), callee_wasm)); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), caller_wasm)); - - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100_000, - GAS_LIMIT, - caller_code_hash.into(), - vec![], - )); - - // Call BOB contract, which attempts to instantiate and call the callee contract and - // makes various assertions on the results from those calls. - assert_ok!(Contracts::call( - Origin::signed(ALICE), - BOB, - 0, - GAS_LIMIT, - callee_code_hash.as_ref().to_vec(), - )); - }); + let (callee_wasm, callee_code_hash) = compile_module::("return_with_data").unwrap(); + let (caller_wasm, caller_code_hash) = compile_module::("caller_contract").unwrap(); + + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), callee_wasm)); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), caller_wasm)); + + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100_000, + GAS_LIMIT, + caller_code_hash.into(), + vec![], + )); + + // Call BOB contract, which attempts to instantiate and call the callee contract and + // makes various assertions on the results from those calls. + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + callee_code_hash.as_ref().to_vec(), + )); + }); } #[test] fn cannot_self_destruct_through_draning() { - let (wasm, code_hash) = compile_module::(&load_wasm("drain.wat")).unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - - // Instantiate the BOB contract. - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100_000, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - // Check that the BOB contract has been instantiated. - assert_matches!( - ContractInfoOf::::get(BOB), - Some(ContractInfo::Alive(_)) - ); + let (wasm, code_hash) = compile_module::("drain").unwrap(); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // Call BOB with no input data, forcing it to run until out-of-balance - // and eventually trapping because below existential deposit. - assert_err_ignore_postinfo!( - Contracts::call( + // Instantiate the BOB contract. + assert_ok!(Contracts::instantiate( Origin::signed(ALICE), - BOB, - 0, + 100_000, GAS_LIMIT, + code_hash.into(), vec![], - ), - "contract trapped during execution" - ); - }); + )); + + // Check that the BOB contract has been instantiated. + assert_matches!( + ContractInfoOf::::get(BOB), + Some(ContractInfo::Alive(_)) + ); + + // Call BOB with no input data, forcing it to run until out-of-balance + // and eventually trapping because below existential deposit. + assert_err_ignore_postinfo!( + Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + vec![], + ), + "contract trapped during execution" + ); + }); } #[test] fn cannot_self_destruct_while_live() { - let (wasm, code_hash) = compile_module::(&load_wasm("self_destruct.wat")) - .unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - - // Instantiate the BOB contract. - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100_000, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - // Check that the BOB contract has been instantiated. - assert_matches!( - ContractInfoOf::::get(BOB), - Some(ContractInfo::Alive(_)) - ); + let (wasm, code_hash) = compile_module::("self_destruct").unwrap(); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // Call BOB with input data, forcing it make a recursive call to itself to - // self-destruct, resulting in a trap. - assert_err_ignore_postinfo!( - Contracts::call( + // Instantiate the BOB contract. + assert_ok!(Contracts::instantiate( Origin::signed(ALICE), - BOB, - 0, + 100_000, GAS_LIMIT, - vec![0], - ), - "contract trapped during execution" - ); + code_hash.into(), + vec![], + )); - // Check that BOB is still alive. - assert_matches!( - ContractInfoOf::::get(BOB), - Some(ContractInfo::Alive(_)) - ); - }); + // Check that the BOB contract has been instantiated. + assert_matches!( + ContractInfoOf::::get(BOB), + Some(ContractInfo::Alive(_)) + ); + + // Call BOB with input data, forcing it make a recursive call to itself to + // self-destruct, resulting in a trap. + assert_err_ignore_postinfo!( + Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + vec![0], + ), + "contract trapped during execution" + ); + + // Check that BOB is still alive. + assert_matches!( + ContractInfoOf::::get(BOB), + Some(ContractInfo::Alive(_)) + ); + }); } #[test] fn self_destruct_works() { - let (wasm, code_hash) = compile_module::(&load_wasm("self_destruct.wat")) - .unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - - // Instantiate the BOB contract. - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100_000, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - - // Check that the BOB contract has been instantiated. - assert_matches!( - ContractInfoOf::::get(BOB), - Some(ContractInfo::Alive(_)) - ); + let (wasm, code_hash) = compile_module::("self_destruct").unwrap(); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - // Call BOB without input data which triggers termination. - assert_matches!( - Contracts::call( + // Instantiate the BOB contract. + assert_ok!(Contracts::instantiate( Origin::signed(ALICE), - BOB, - 0, + 100_000, GAS_LIMIT, + code_hash.into(), vec![], - ), - Ok(_) - ); + )); - // Check that account is gone - assert!(ContractInfoOf::::get(BOB).is_none()); + // Check that the BOB contract has been instantiated. + assert_matches!( + ContractInfoOf::::get(BOB), + Some(ContractInfo::Alive(_)) + ); - // check that the beneficiary (django) got remaining balance - assert_eq!(Balances::free_balance(DJANGO), 100_000); - }); + // Call BOB without input data which triggers termination. + assert_matches!( + Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + vec![], + ), + Ok(_) + ); + + // Check that account is gone + assert!(ContractInfoOf::::get(BOB).is_none()); + + // check that the beneficiary (django) got remaining balance + assert_eq!(Balances::free_balance(DJANGO), 100_000); + }); } // This tests that one contract cannot prevent another from self-destructing by sending it // additional funds after it has been drained. #[test] fn destroy_contract_and_transfer_funds() { - let (callee_wasm, callee_code_hash) = - compile_module::(&load_wasm("self_destruct.wat")).unwrap(); - let (caller_wasm, caller_code_hash) = - compile_module::(&load_wasm("destroy_and_transfer.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - // Create - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), callee_wasm)); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), caller_wasm)); - - // This deploys the BOB contract, which in turn deploys the CHARLIE contract during - // construction. - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 200_000, - GAS_LIMIT, - caller_code_hash.into(), - callee_code_hash.as_ref().to_vec(), - )); - - // Check that the CHARLIE contract has been instantiated. - assert_matches!( - ContractInfoOf::::get(CHARLIE), - Some(ContractInfo::Alive(_)) - ); + let (callee_wasm, callee_code_hash) = compile_module::("self_destruct").unwrap(); + let (caller_wasm, caller_code_hash) = compile_module::("destroy_and_transfer").unwrap(); - // Call BOB, which calls CHARLIE, forcing CHARLIE to self-destruct. - assert_ok!(Contracts::call( - Origin::signed(ALICE), - BOB, - 0, - GAS_LIMIT, - CHARLIE.encode(), - )); - - // Check that CHARLIE has moved on to the great beyond (ie. died). - assert!(ContractInfoOf::::get(CHARLIE).is_none()); - }); -} + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + // Create + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), callee_wasm)); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), caller_wasm)); -#[test] -fn cannot_self_destruct_in_constructor() { - let (wasm, code_hash) = - compile_module::(&load_wasm("self_destructing_constructor.wat")).unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - - // Fail to instantiate the BOB because the call that is issued in the deploy - // function exhausts all balances which puts it below the existential deposit. - assert_err_ignore_postinfo!( - Contracts::instantiate( + // This deploys the BOB contract, which in turn deploys the CHARLIE contract during + // construction. + assert_ok!(Contracts::instantiate( Origin::signed(ALICE), - 100_000, + 200_000, GAS_LIMIT, - code_hash.into(), - vec![], - ), - "contract trapped during execution" - ); - }); + caller_code_hash.into(), + callee_code_hash.as_ref().to_vec(), + )); + + // Check that the CHARLIE contract has been instantiated. + assert_matches!( + ContractInfoOf::::get(CHARLIE), + Some(ContractInfo::Alive(_)) + ); + + // Call BOB, which calls CHARLIE, forcing CHARLIE to self-destruct. + assert_ok!(Contracts::call( + Origin::signed(ALICE), + BOB, + 0, + GAS_LIMIT, + CHARLIE.encode(), + )); + + // Check that CHARLIE has moved on to the great beyond (ie. died). + assert!(ContractInfoOf::::get(CHARLIE).is_none()); + }); } -fn get_runtime_storage() { - let (wasm, code_hash) = compile_module::(&load_wasm("get_runtime_storage.wat")) - .unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - - frame_support::storage::unhashed::put_raw( - &[1, 2, 3, 4], - 0x14144020u32.to_le_bytes().to_vec().as_ref() - ); +#[test] +fn cannot_self_destruct_in_constructor() { + let (wasm, code_hash) = compile_module::("self_destructing_constructor").unwrap(); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - assert_ok!(Contracts::call( - Origin::signed(ALICE), - BOB, - 0, - GAS_LIMIT, - vec![], - )); - }); + // Fail to instantiate the BOB because the call that is issued in the deploy + // function exhausts all balances which puts it below the existential deposit. + assert_err_ignore_postinfo!( + Contracts::instantiate( + Origin::signed(ALICE), + 100_000, + GAS_LIMIT, + code_hash.into(), + vec![], + ), + "contract trapped during execution" + ); + }); } #[test] -fn crypto_hashes() { - let (wasm, code_hash) = compile_module::(&load_wasm("crypto_hashes.wat")).unwrap(); - - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - Balances::deposit_creating(&ALICE, 1_000_000); - assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); - - // Instantiate the CRYPTO_HASHES contract. - assert_ok!(Contracts::instantiate( - Origin::signed(ALICE), - 100_000, - GAS_LIMIT, - code_hash.into(), - vec![], - )); - // Perform the call. - let input = b"_DEAD_BEEF"; - use sp_io::hashing::*; - // Wraps a hash function into a more dynamic form usable for testing. - macro_rules! dyn_hash_fn { - ($name:ident) => { - Box::new(|input| $name(input).as_ref().to_vec().into_boxed_slice()) - }; - } - // All hash functions and their associated output byte lengths. - let test_cases: &[(Box Box<[u8]>>, usize)] = &[ - (dyn_hash_fn!(sha2_256), 32), - (dyn_hash_fn!(keccak_256), 32), - (dyn_hash_fn!(blake2_256), 32), - (dyn_hash_fn!(blake2_128), 16), - ]; - // Test the given hash functions for the input: "_DEAD_BEEF" - for (n, (hash_fn, expected_size)) in test_cases.iter().enumerate() { - // We offset data in the contract tables by 1. - let mut params = vec![(n + 1) as u8]; - params.extend_from_slice(input); - let result = >::bare_call( - ALICE, +fn get_runtime_storage() { + let (wasm, code_hash) = compile_module::("get_runtime_storage").unwrap(); + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + + frame_support::storage::unhashed::put_raw( + &[1, 2, 3, 4], + 0x14144020u32.to_le_bytes().to_vec().as_ref() + ); + + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100, + GAS_LIMIT, + code_hash.into(), + vec![], + )); + assert_ok!(Contracts::call( + Origin::signed(ALICE), BOB, 0, GAS_LIMIT, - params, - ).unwrap(); - assert_eq!(result.status, 0); - let expected = hash_fn(input.as_ref()); - assert_eq!(&result.data[..*expected_size], &*expected); - } - }) + vec![], + )); + }); } -fn load_wasm(file_name: &str) -> String { - let path = ["tests/", file_name].concat(); - std::fs::read_to_string(&path).expect(&format!("Unable to read {} file", path)) +#[test] +fn crypto_hashes() { + let (wasm, code_hash) = compile_module::("crypto_hashes").unwrap(); + + ExtBuilder::default() + .existential_deposit(50) + .build() + .execute_with(|| { + let _ = Balances::deposit_creating(&ALICE, 1_000_000); + assert_ok!(Contracts::put_code(Origin::signed(ALICE), wasm)); + + // Instantiate the CRYPTO_HASHES contract. + assert_ok!(Contracts::instantiate( + Origin::signed(ALICE), + 100_000, + GAS_LIMIT, + code_hash.into(), + vec![], + )); + // Perform the call. + let input = b"_DEAD_BEEF"; + use sp_io::hashing::*; + // Wraps a hash function into a more dynamic form usable for testing. + macro_rules! dyn_hash_fn { + ($name:ident) => { + Box::new(|input| $name(input).as_ref().to_vec().into_boxed_slice()) + }; + } + // All hash functions and their associated output byte lengths. + let test_cases: &[(Box Box<[u8]>>, usize)] = &[ + (dyn_hash_fn!(sha2_256), 32), + (dyn_hash_fn!(keccak_256), 32), + (dyn_hash_fn!(blake2_256), 32), + (dyn_hash_fn!(blake2_128), 16), + ]; + // Test the given hash functions for the input: "_DEAD_BEEF" + for (n, (hash_fn, expected_size)) in test_cases.iter().enumerate() { + // We offset data in the contract tables by 1. + let mut params = vec![(n + 1) as u8]; + params.extend_from_slice(input); + let result = >::bare_call( + ALICE, + BOB, + 0, + GAS_LIMIT, + params, + ).unwrap(); + assert_eq!(result.status, 0); + let expected = hash_fn(input.as_ref()); + assert_eq!(&result.data[..*expected_size], &*expected); + } + }) } -- GitLab From e6d5d499fb37fac3eee04a0394f21c678a504d3e Mon Sep 17 00:00:00 2001 From: pscott <30843220+pscott@users.noreply.github.com> Date: Mon, 25 May 2020 17:26:13 +0200 Subject: [PATCH 115/150] Remove sleep in import blocks (#6124) * Add Delay and info logging * Switch from Duration to Delay in enum declaration * Remove sleep from import_blocks fn * Set back constans and remove unnecessary code * Fix hot loop * Reset timer once poll is ready, not when it's pending --- client/service/src/chain_ops.rs | 54 ++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/client/service/src/chain_ops.rs b/client/service/src/chain_ops.rs index 0297ad5c90..cb4ed24b60 100644 --- a/client/service/src/chain_ops.rs +++ b/client/service/src/chain_ops.rs @@ -39,7 +39,9 @@ use sp_core::storage::{StorageKey, well_known_keys, ChildInfo, Storage, StorageC use sc_client_api::{StorageProvider, BlockBackend, UsageProvider}; use std::{io::{Read, Write, Seek}, pin::Pin, collections::HashMap}; -use std::{thread, time::{Duration, Instant}}; +use std::time::{Duration, Instant}; +use futures_timer::Delay; +use std::task::Poll; use serde_json::{de::IoRead as JsonIoRead, Deserializer, StreamDeserializer}; use std::convert::{TryFrom, TryInto}; use sp_runtime::traits::{CheckedDiv, Saturating}; @@ -272,14 +274,14 @@ enum ImportState where /// The queue is full (contains at least MAX_PENDING_BLOCKS blocks) and we are waiting for it to catch up. WaitingForImportQueueToCatchUp{ block_iter: BlockIter, - delay: Duration, + delay: Delay, block: SignedBlock }, // We have added all the blocks to the queue but they are still being processed. WaitingForImportQueueToFinish{ num_expected_blocks: Option, read_block_count: u64, - delay: Duration, + delay: Delay, }, } @@ -373,7 +375,7 @@ impl< // The iterator is over: we now need to wait for the import queue to finish. let num_expected_blocks = block_iter.num_expected_blocks(); let read_block_count = block_iter.read_block_count(); - let delay = Duration::from_millis(DELAY_TIME); + let delay = Delay::new(Duration::from_millis(DELAY_TIME)); state = Some(ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay}); }, Some(block_result) => { @@ -383,7 +385,7 @@ impl< if read_block_count - link.imported_blocks >= MAX_PENDING_BLOCKS { // The queue is full, so do not add this block and simply wait until // the queue has made some progress. - let delay = Duration::from_millis(DELAY_TIME); + let delay = Delay::new(Duration::from_millis(DELAY_TIME)); state = Some(ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block}); } else { // Queue is not full, we can keep on adding blocks to the queue. @@ -392,18 +394,26 @@ impl< } } Err(e) => { - return std::task::Poll::Ready( + return Poll::Ready( Err(Error::Other(format!("Error reading block #{}: {}", read_block_count, e)))) } } } } }, - ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block} => { + ImportState::WaitingForImportQueueToCatchUp{block_iter, mut delay, block} => { let read_block_count = block_iter.read_block_count(); if read_block_count - link.imported_blocks >= MAX_PENDING_BLOCKS { - thread::sleep(delay); // Queue is still full, so wait until there is room to insert our block. + match Pin::new(&mut delay).poll(cx) { + Poll::Pending => { + state = Some(ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block}); + return Poll::Pending + }, + Poll::Ready(_) => { + delay.reset(Duration::from_millis(DELAY_TIME)); + }, + } state = Some(ImportState::WaitingForImportQueueToCatchUp{block_iter, delay, block}); } else { // Queue is no longer full, so we can add our block to the queue. @@ -412,7 +422,7 @@ impl< state = Some(ImportState::Reading{block_iter}); } }, - ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay} => { + ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, mut delay} => { // All the blocks have been added to the queue, which doesn't mean they // have all been properly imported. if importing_is_done(num_expected_blocks, read_block_count, link.imported_blocks) { @@ -421,10 +431,20 @@ impl< "🎉 Imported {} blocks. Best: #{}", read_block_count, client.chain_info().best_number ); - return std::task::Poll::Ready(Ok(())) + return Poll::Ready(Ok(())) } else { - thread::sleep(delay); // Importing is not done, we still have to wait for the queue to finish. + // Wait for the delay, because we know the queue is lagging behind. + match Pin::new(&mut delay).poll(cx) { + Poll::Pending => { + state = Some(ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay}); + return Poll::Pending + }, + Poll::Ready(_) => { + delay.reset(Duration::from_millis(DELAY_TIME)); + }, + } + state = Some(ImportState::WaitingForImportQueueToFinish{num_expected_blocks, read_block_count, delay}); } } @@ -436,7 +456,7 @@ impl< speedometer.notify_user(best_number); if link.has_error { - return std::task::Poll::Ready(Err( + return Poll::Ready(Err( Error::Other( format!("Stopping after #{} blocks because of an error", link.imported_blocks) ) @@ -444,7 +464,7 @@ impl< } cx.waker().wake_by_ref(); - std::task::Poll::Pending + Poll::Pending }); Box::pin(import) } @@ -477,7 +497,7 @@ impl< let client = &self.client; if last < block { - return std::task::Poll::Ready(Err("Invalid block range specified".into())); + return Poll::Ready(Err("Invalid block range specified".into())); } if !wrote_header { @@ -501,19 +521,19 @@ impl< } }, // Reached end of the chain. - None => return std::task::Poll::Ready(Ok(())), + None => return Poll::Ready(Ok(())), } if (block % 10000.into()).is_zero() { info!("#{}", block); } if block == last { - return std::task::Poll::Ready(Ok(())); + return Poll::Ready(Ok(())); } block += One::one(); // Re-schedule the task in order to continue the operation. cx.waker().wake_by_ref(); - std::task::Poll::Pending + Poll::Pending }); Box::pin(export) -- GitLab From d74902446ac5f88a4061f3a6dd4e948a79a135da Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 25 May 2020 17:26:36 +0200 Subject: [PATCH 116/150] Bump to libp2p v0.19.1 (#6125) --- Cargo.lock | 44 +++++++++++++------------- bin/node/browser-testing/Cargo.toml | 2 +- bin/utils/subkey/Cargo.toml | 2 +- client/authority-discovery/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 4 +-- client/network/test/Cargo.toml | 2 +- client/peerset/Cargo.toml | 2 +- client/telemetry/Cargo.toml | 2 +- primitives/consensus/common/Cargo.toml | 2 +- primitives/phragmen/fuzzer/Cargo.lock | 2 +- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8194436e1f..569f21c3cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2612,9 +2612,9 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec214d189b57e4412f079ac5a1442578d06b12ca7282ba4696104cc92ab96c1" +checksum = "057eba5432d3e740e313c6e13c9153d0cb76b4f71bfc2e5242ae5bdb7d41af67" dependencies = [ "bytes 0.5.4", "futures 0.3.5", @@ -2684,9 +2684,9 @@ dependencies = [ [[package]] name = "libp2p-core-derive" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67f0d915bee5d457a6d113377101e1f06e86a4286778aa4c6939553e9a4d7033" +checksum = "f09548626b737ed64080fde595e06ce1117795b8b9fc4d2629fa36561c583171" dependencies = [ "quote 1.0.5", "syn 1.0.21", @@ -2694,9 +2694,9 @@ dependencies = [ [[package]] name = "libp2p-deflate" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975c847575ef9b3d63f9c11d465e9a9b0ea940cfa408b93cc6981bbc3b1bac40" +checksum = "5c4acff33f5bfe154bafe14c6c08655d4b1e1736afaca78014111bc1742a2016" dependencies = [ "flate2", "futures 0.3.5", @@ -2733,9 +2733,9 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce48659363fe765c09d77eb5b2248e04362557b11bba3701f05879ad34919ccd" +checksum = "1675c23765e37ddbf6bf05fb520be8f7df3f5f4981d68f185bb95f9b047c576a" dependencies = [ "base64 0.11.0", "byteorder 1.3.4", @@ -2758,9 +2758,9 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a455af71c59473444eba05e83dbaa20262bdbd9b4154f22389510fbac16f201" +checksum = "6438ed8ca240c7635c9caa3be6c5258bc0058553ae97ba81737f04e5d33804f5" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2801,9 +2801,9 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc788d92111802cb0c92d2e032fa6f46333aaeb5650c2f37b5d3eba78cabe6" +checksum = "51b00163d13f705aae67c427bea0575f8aaf63da6524f9bd4a5a093b8bda0b38" dependencies = [ "async-std", "data-encoding", @@ -2823,9 +2823,9 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4095bce2100f840883f1f75dbd010c966ee4ad323ae9f82026396da5cf6cce68" +checksum = "34ce63313ad4bce2d76e54c292a1293ea47a0ebbe16708f1513fa62184992f53" dependencies = [ "bytes 0.5.4", "fnv", @@ -2860,9 +2860,9 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82930c36490008b1ef2f26c237a2c205c38ef6edc263738d0528b842740ab09f" +checksum = "c189cf1dfe4b3f01e2c0fe5e97a6f5df8aeb6f3569e26981015eb7c08015ce5f" dependencies = [ "futures 0.3.5", "libp2p-core", @@ -2907,9 +2907,9 @@ dependencies = [ [[package]] name = "libp2p-secio" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e30b873276846181fa9c04126653678c2797cb1556361d01b7b7fd6bf24682" +checksum = "7b73f0cc119c83a5b619d6d11074a319fdb4aa4daf8088ade00d511418566e28" dependencies = [ "aes-ctr", "ctr", @@ -2952,9 +2952,9 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4462bd96b97cac3f3a83b1b343ad3c3460cebbc8d929c040b1520c30e3611e08" +checksum = "309f95fce9bec755eff5406f8b822fd3969990830c2b54f752e1fc181d5ace3e" dependencies = [ "async-std", "futures 0.3.5", @@ -2968,9 +2968,9 @@ dependencies = [ [[package]] name = "libp2p-uds" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69660d235449bb2d99333b9892c9176d06fd2b380490cb8213feb5b015678cf1" +checksum = "78d51726e063e8d73b103331576bb7e8fad187a3f0c227933a10b3542e2ad3f4" dependencies = [ "async-std", "futures 0.3.5", diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 04d48c8cbd..bd7854b0ba 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -8,7 +8,7 @@ license = "Apache-2.0" [dependencies] futures-timer = "3.0.2" -libp2p = { version = "0.19.0", default-features = false } +libp2p = { version = "0.19.1", default-features = false } jsonrpc-core = "14.0.5" serde = "1.0.106" serde_json = "1.0.48" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 9c4ca36e16..950e77a8e1 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -33,7 +33,7 @@ derive_more = { version = "0.99.2" } sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" -libp2p = "0.19.0" +libp2p = "0.19.1" serde_json = "1.0" [features] diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 69d5c51846..92cf15051e 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", default-features = false, version = "1 derive_more = "0.99.2" futures = "0.3.4" futures-timer = "3.0.1" -libp2p = { version = "0.19.0", default-features = false, features = ["secp256k1", "libp2p-websocket"] } +libp2p = { version = "0.19.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} prost = "0.6.1" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 10b4a9446e..3ccdae6b5c 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" futures-timer = "3.0.1" -libp2p = { version = "0.19.0", default-features = false, features = ["websocket"] } +libp2p = { version = "0.19.1", default-features = false, features = ["websocket"] } log = "0.4.8" lru = "0.4.3" sc-network = { version = "0.8.0-dev", path = "../network" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 01121b922d..9c32eeaf7d 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -63,7 +63,7 @@ wasm-timer = "0.2" zeroize = "1.0.0" [dependencies.libp2p] -version = "0.19.0" +version = "0.19.1" default-features = false features = ["websocket", "kad", "mdns", "ping", "identify", "mplex", "yamux", "noise", "tcp-async-std"] @@ -71,7 +71,7 @@ features = ["websocket", "kad", "mdns", "ping", "identify", "mplex", "yamux", "n async-std = "1.5" assert_matches = "1.3" env_logger = "0.7.0" -libp2p = { version = "0.19.0", default-features = false, features = ["secio"] } +libp2p = { version = "0.19.1", default-features = false, features = ["secio"] } quickcheck = "0.9.0" rand = "0.7.2" sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 58ad79163b..554a30c111 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -19,7 +19,7 @@ parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" rand = "0.7.2" -libp2p = { version = "0.19.0", default-features = false, features = ["libp2p-websocket"] } +libp2p = { version = "0.19.1", default-features = false, features = ["libp2p-websocket"] } sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } sc-client-api = { version = "2.0.0-dev", path = "../../api" } diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index f47ea7a70e..851128e358 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" -libp2p = { version = "0.19.0", default-features = false } +libp2p = { version = "0.19.1", default-features = false } sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils"} log = "0.4.8" serde_json = "1.0.41" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 8ab0f828d1..bf8440356f 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -19,7 +19,7 @@ parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" wasm-timer = "0.2.0" -libp2p = { version = "0.19.0", default-features = false, features = ["websocket", "wasm-ext", "tcp-async-std", "dns"] } +libp2p = { version = "0.19.1", default-features = false, features = ["websocket", "wasm-ext", "tcp-async-std", "dns"] } log = "0.4.8" pin-project = "0.4.6" rand = "0.7.2" diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index 6fda982dae..b7b0f111de 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -libp2p = { version = "0.19.0", default-features = false } +libp2p = { version = "0.19.1", default-features = false } log = "0.4.8" sp-core = { path= "../../core", version = "2.0.0-dev"} sp-inherents = { version = "2.0.0-dev", path = "../../inherents" } diff --git a/primitives/phragmen/fuzzer/Cargo.lock b/primitives/phragmen/fuzzer/Cargo.lock index 3ef2a27324..49006f5be8 100644 --- a/primitives/phragmen/fuzzer/Cargo.lock +++ b/primitives/phragmen/fuzzer/Cargo.lock @@ -540,7 +540,7 @@ dependencies = [ [[package]] name = "memory-db" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "198831fe8722331a395bc199a5d08efbc197497ef354cb4c77b969c02ffc0fc4" dependencies = [ -- GitLab From 599ba75bc2b5acd238c21c5c7efe8e2ad8d401ee Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Mon, 25 May 2020 18:30:48 +0200 Subject: [PATCH 117/150] Tagging as rc1 --- Cargo.lock | 1152 ++++++++--------- bin/node-template/node/Cargo.toml | 40 +- bin/node-template/pallets/template/Cargo.toml | 12 +- bin/node-template/runtime/Cargo.toml | 48 +- bin/node/bench/Cargo.toml | 20 +- bin/node/browser-testing/Cargo.toml | 6 +- bin/node/cli/Cargo.toml | 118 +- bin/node/cli/tests/build_spec_works.rs | 2 +- bin/node/cli/tests/check_block_works.rs | 2 +- bin/node/cli/tests/common.rs | 2 +- bin/node/cli/tests/export_import_flow.rs | 6 +- bin/node/cli/tests/inspect_works.rs | 2 +- bin/node/cli/tests/purge_chain_works.rs | 2 +- .../tests/running_the_node_and_interrupt.rs | 2 +- bin/node/executor/Cargo.toml | 50 +- bin/node/inspect/Cargo.toml | 14 +- bin/node/primitives/Cargo.toml | 12 +- bin/node/rpc-client/Cargo.toml | 6 +- bin/node/rpc/Cargo.toml | 40 +- bin/node/runtime/Cargo.toml | 112 +- bin/node/testing/Cargo.toml | 68 +- bin/utils/chain-spec-builder/Cargo.toml | 10 +- bin/utils/subkey/Cargo.toml | 20 +- client/api/Cargo.toml | 44 +- client/authority-discovery/Cargo.toml | 24 +- client/basic-authorship/Cargo.toml | 30 +- client/block-builder/Cargo.toml | 20 +- client/chain-spec/Cargo.toml | 14 +- client/chain-spec/derive/Cargo.toml | 2 +- client/cli/Cargo.toml | 32 +- client/consensus/aura/Cargo.toml | 50 +- client/consensus/babe/Cargo.toml | 58 +- client/consensus/babe/rpc/Cargo.toml | 30 +- client/consensus/common/Cargo.toml | 10 +- client/consensus/epochs/Cargo.toml | 10 +- client/consensus/manual-seal/Cargo.toml | 26 +- client/consensus/pow/Cargo.toml | 24 +- client/consensus/slots/Cargo.toml | 24 +- client/consensus/uncles/Cargo.toml | 14 +- client/db/Cargo.toml | 28 +- client/executor/Cargo.toml | 36 +- client/executor/common/Cargo.toml | 12 +- client/executor/runtime-test/Cargo.toml | 14 +- client/executor/wasmi/Cargo.toml | 12 +- client/executor/wasmtime/Cargo.toml | 12 +- client/finality-grandpa/Cargo.toml | 54 +- client/finality-grandpa/rpc/Cargo.toml | 6 +- client/informant/Cargo.toml | 12 +- client/keystore/Cargo.toml | 6 +- client/network-gossip/Cargo.toml | 8 +- client/network/Cargo.toml | 32 +- client/network/test/Cargo.toml | 26 +- client/offchain/Cargo.toml | 26 +- client/peerset/Cargo.toml | 4 +- client/proposer-metrics/Cargo.toml | 4 +- client/rpc-api/Cargo.toml | 14 +- client/rpc-servers/Cargo.toml | 4 +- client/rpc/Cargo.toml | 44 +- client/service/Cargo.toml | 68 +- client/service/test/Cargo.toml | 40 +- client/state-db/Cargo.toml | 6 +- client/telemetry/Cargo.toml | 2 +- client/tracing/Cargo.toml | 4 +- client/transaction-pool/Cargo.toml | 28 +- client/transaction-pool/graph/Cargo.toml | 14 +- frame/assets/Cargo.toml | 14 +- frame/aura/Cargo.toml | 26 +- frame/authority-discovery/Cargo.toml | 22 +- frame/authorship/Cargo.toml | 18 +- frame/babe/Cargo.toml | 30 +- frame/balances/Cargo.toml | 18 +- frame/benchmark/Cargo.toml | 14 +- frame/benchmarking/Cargo.toml | 16 +- frame/collective/Cargo.toml | 18 +- frame/contracts/Cargo.toml | 26 +- frame/contracts/common/Cargo.toml | 6 +- frame/contracts/rpc/Cargo.toml | 16 +- frame/contracts/rpc/runtime-api/Cargo.toml | 10 +- frame/democracy/Cargo.toml | 24 +- frame/elections-phragmen/Cargo.toml | 22 +- frame/elections/Cargo.toml | 16 +- frame/evm/Cargo.toml | 18 +- frame/example-offchain-worker/Cargo.toml | 14 +- frame/example/Cargo.toml | 18 +- frame/executive/Cargo.toml | 26 +- frame/finality-tracker/Cargo.toml | 18 +- frame/generic-asset/Cargo.toml | 14 +- frame/grandpa/Cargo.toml | 38 +- frame/identity/Cargo.toml | 18 +- frame/im-online/Cargo.toml | 24 +- frame/indices/Cargo.toml | 18 +- frame/membership/Cargo.toml | 14 +- frame/metadata/Cargo.toml | 6 +- frame/nicks/Cargo.toml | 16 +- frame/offences/Cargo.toml | 18 +- frame/offences/benchmarking/Cargo.toml | 36 +- frame/randomness-collective-flip/Cargo.toml | 14 +- frame/recovery/Cargo.toml | 16 +- frame/scheduler/Cargo.toml | 16 +- frame/scored-pool/Cargo.toml | 16 +- frame/session/Cargo.toml | 24 +- frame/session/benchmarking/Cargo.toml | 26 +- frame/society/Cargo.toml | 16 +- frame/staking/Cargo.toml | 38 +- frame/staking/fuzzer/Cargo.lock | 2 +- frame/staking/fuzzer/Cargo.toml | 26 +- frame/staking/reward-curve/Cargo.toml | 4 +- frame/sudo/Cargo.toml | 14 +- frame/support/Cargo.toml | 24 +- frame/support/procedural/Cargo.toml | 4 +- frame/support/procedural/tools/Cargo.toml | 4 +- .../procedural/tools/derive/Cargo.toml | 2 +- frame/support/test/Cargo.toml | 14 +- frame/system/Cargo.toml | 18 +- frame/system/benchmarking/Cargo.toml | 16 +- frame/system/rpc/runtime-api/Cargo.toml | 4 +- frame/timestamp/Cargo.toml | 22 +- frame/transaction-payment/Cargo.toml | 20 +- frame/transaction-payment/rpc/Cargo.toml | 14 +- .../rpc/runtime-api/Cargo.toml | 10 +- frame/treasury/Cargo.toml | 18 +- frame/utility/Cargo.toml | 20 +- frame/vesting/Cargo.toml | 20 +- primitives/allocator/Cargo.toml | 8 +- primitives/api/Cargo.toml | 16 +- primitives/api/proc-macro/Cargo.toml | 2 +- primitives/api/test/Cargo.toml | 22 +- primitives/application-crypto/Cargo.toml | 8 +- primitives/application-crypto/test/Cargo.toml | 12 +- primitives/arithmetic/Cargo.toml | 6 +- primitives/arithmetic/fuzzer/Cargo.toml | 4 +- primitives/authority-discovery/Cargo.toml | 10 +- primitives/authorship/Cargo.toml | 8 +- primitives/block-builder/Cargo.toml | 10 +- primitives/blockchain/Cargo.toml | 10 +- primitives/chain-spec/Cargo.toml | 2 +- primitives/consensus/aura/Cargo.toml | 14 +- primitives/consensus/babe/Cargo.toml | 18 +- primitives/consensus/common/Cargo.toml | 20 +- primitives/consensus/pow/Cargo.toml | 10 +- primitives/consensus/vrf/Cargo.toml | 8 +- primitives/core/Cargo.toml | 14 +- primitives/database/Cargo.toml | 2 +- primitives/debug-derive/Cargo.toml | 2 +- primitives/externalities/Cargo.toml | 6 +- primitives/finality-grandpa/Cargo.toml | 12 +- primitives/finality-tracker/Cargo.toml | 6 +- primitives/inherents/Cargo.toml | 6 +- primitives/io/Cargo.toml | 16 +- primitives/keyring/Cargo.toml | 6 +- primitives/offchain/Cargo.toml | 10 +- primitives/panic-handler/Cargo.toml | 2 +- primitives/phragmen/Cargo.toml | 14 +- primitives/phragmen/compact/Cargo.toml | 2 +- primitives/phragmen/fuzzer/Cargo.lock | 2 +- primitives/phragmen/fuzzer/Cargo.toml | 6 +- primitives/rpc/Cargo.toml | 4 +- primitives/runtime-interface/Cargo.toml | 20 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../test-wasm-deprecated/Cargo.toml | 10 +- .../runtime-interface/test-wasm/Cargo.toml | 10 +- primitives/runtime-interface/test/Cargo.toml | 18 +- primitives/runtime/Cargo.toml | 16 +- primitives/sandbox/Cargo.toml | 10 +- primitives/serializer/Cargo.toml | 2 +- primitives/session/Cargo.toml | 12 +- primitives/staking/Cargo.toml | 6 +- primitives/state-machine/Cargo.toml | 12 +- primitives/std/Cargo.toml | 2 +- primitives/storage/Cargo.toml | 6 +- primitives/test-primitives/Cargo.toml | 8 +- primitives/timestamp/Cargo.toml | 10 +- primitives/tracing/Cargo.toml | 2 +- primitives/transaction-pool/Cargo.toml | 8 +- primitives/trie/Cargo.toml | 8 +- primitives/utils/Cargo.toml | 2 +- primitives/version/Cargo.toml | 6 +- primitives/wasm-interface/Cargo.toml | 4 +- test-utils/Cargo.toml | 2 +- test-utils/client/Cargo.toml | 24 +- test-utils/runtime/Cargo.toml | 60 +- test-utils/runtime/client/Cargo.toml | 24 +- .../runtime/transaction-pool/Cargo.toml | 12 +- utils/browser/Cargo.toml | 12 +- utils/build-script-utils/Cargo.toml | 2 +- utils/fork-tree/Cargo.toml | 2 +- utils/frame/benchmarking-cli/Cargo.toml | 20 +- utils/frame/rpc/support/Cargo.toml | 10 +- utils/frame/rpc/system/Cargo.toml | 20 +- utils/prometheus/Cargo.toml | 2 +- 190 files changed, 2160 insertions(+), 2190 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 569f21c3cf..f7decfec32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,15 +10,6 @@ dependencies = [ "regex", ] -[[package]] -name = "addr2line" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456d75cbb82da1ad150c8a9d97285ffcd21c9931dcb11e995903e7d75141b38b" -dependencies = [ - "gimli 0.21.0", -] - [[package]] name = "adler32" version = "1.0.4" @@ -108,9 +99,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.30" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2494382e9ba43995f3c56359e518641f450f5c36feeb4632a75cde2ec297c867" +checksum = "d9a60d744a80c30fcb657dfe2c1b22bcb3e814c1a1e3674f32bf5820b570fbff" [[package]] name = "approx" @@ -123,15 +114,15 @@ dependencies = [ [[package]] name = "arbitrary" -version = "0.4.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5eb01a9ab8a3369f2f7632b9461c34f5920bd454774bab5b9fc6744f21d6143" +checksum = "75153c95fdedd7db9732dfbfc3702324a1627eec91ba56e37cd0ac78314ab2ed" [[package]] name = "arc-swap" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b585a98a234c46fc563103e9278c9391fde1f4e6850334da895d27edb9580f62" +checksum = "d663a8e9a99154b5fb793032533f6328da35e23aac63d5c152279aa8ba356825" [[package]] name = "arrayref" @@ -169,8 +160,8 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d0864d84b8e07b145449be9a8537db86bf9de5ce03b913214694643b4743502" dependencies = [ - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -234,7 +225,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95fd83426b89b034bf4e9ceb9c533c2f2386b813fd3dcae0a425ec6f1837d78a" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "rustls", "webpki", "webpki-roots 0.19.0", @@ -265,17 +256,26 @@ checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" -version = "0.3.48" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130" +checksum = "b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e" dependencies = [ - "addr2line", + "backtrace-sys", "cfg-if", "libc", - "object 0.19.0", "rustc-demangle", ] +[[package]] +name = "backtrace-sys" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de8aba10a69c8e8d7622c5710229485ec32e9d55fdad160ea559c086fdcd118" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "base58" version = "0.1.0" @@ -290,9 +290,9 @@ checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "base64" -version = "0.12.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d1ccbaf7d9ec9537465a97bf19edc1a4e158ecb49fc16178202238c569cc42" +checksum = "7d5ca2cd0adc3f48f9e9ea5a6bbdf9ccc0bfade884847e484d452414c7ccffb3" [[package]] name = "bincode" @@ -321,7 +321,7 @@ dependencies = [ "log", "peeking_take_while", "proc-macro2", - "quote 1.0.5", + "quote 1.0.3", "regex", "rustc-hash", "shlex", @@ -446,9 +446,9 @@ checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" [[package]] name = "bstr" -version = "0.2.13" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" +checksum = "2889e6d50f394968c8bf4240dc3f2a7eb4680844d27308f798229ac9d4725f41" dependencies = [ "lazy_static", "memchr", @@ -467,9 +467,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.3.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" +checksum = "12ae9db68ad7fac5fe51304d20f016c911539251075a214f8e663babefa35187" [[package]] name = "byte-slice-cast" @@ -541,9 +541,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.52" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d87b23d6a92cd03af510a5ade527033f6aa6fa92161e2d5863a907d4c5e31d" +checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" dependencies = [ "jobserver", ] @@ -574,7 +574,7 @@ dependencies = [ [[package]] name = "chain-spec-builder" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "ansi_term 0.12.1", "node-cli", @@ -611,9 +611,9 @@ dependencies = [ [[package]] name = "clap" -version = "2.33.1" +version = "2.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" +checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" dependencies = [ "ansi_term 0.11.0", "atty", @@ -733,7 +733,7 @@ dependencies = [ "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.20.0", + "gimli", "log", "regalloc", "serde", @@ -825,7 +825,7 @@ dependencies = [ "clap", "criterion-plot 0.3.1", "csv", - "itertools 0.8.2", + "itertools", "lazy_static", "libc", "num-traits 0.2.11", @@ -843,16 +843,16 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" +checksum = "1fc755679c12bda8e5523a71e4d654b6bf2e14bd838dfc48cde6559a05caf7d1" dependencies = [ "atty", "cast", "clap", - "criterion-plot 0.4.2", + "criterion-plot 0.4.1", "csv", - "itertools 0.9.0", + "itertools", "lazy_static", "num-traits 0.2.11", "oorandom", @@ -874,17 +874,17 @@ checksum = "76f9212ddf2f4a9eb2d401635190600656a1f88a932ef53d06e7fa4c7e02fb8e" dependencies = [ "byteorder 1.3.4", "cast", - "itertools 0.8.2", + "itertools", ] [[package]] name = "criterion-plot" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" +checksum = "a01e15e0ea58e8234f96146b1f91fa9d0e4dd7a38da93ff7a75d42c0b9d3a545" dependencies = [ "cast", - "itertools 0.9.0", + "itertools", ] [[package]] @@ -993,12 +993,12 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.14" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6b25ee9ac1995c54d7adb2eff8cfffb7260bc774fb63c601ec65467f43cd9d" +checksum = "47c5e5ac752e18207b12e16b10631ae5f7f68f8805f335f9b817ead83d9ffce1" dependencies = [ - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -1042,13 +1042,13 @@ checksum = "11c0346158a19b3627234e15596f5e465c360fcdb97d817bcb255e0510f5a788" [[package]] name = "derive_more" -version = "0.99.6" +version = "0.99.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46b046a346c374c6c3c84d2070bfe33904504686bdf949c2d8eb22edad3f270c" +checksum = "e2323f3f47db9a0e77ce7a300605d8d2098597fc451ed1a97bb1f6411bb550a7" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -1135,22 +1135,22 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" +checksum = "a80e524ebf194285b57e5e7944018721c7fffc673253f5183f7accd88a2a3b0c" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" +checksum = "2ed9afacaea0301eefb738c9deea725e6d53938004597cdc518a8cf9a7aa2f03" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -1267,7 +1267,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", ] [[package]] @@ -1287,9 +1287,9 @@ dependencies = [ [[package]] name = "failure" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +checksum = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b" dependencies = [ "backtrace", "failure_derive", @@ -1297,13 +1297,13 @@ dependencies = [ [[package]] name = "failure_derive" -version = "0.1.8" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +checksum = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "synstructure", ] @@ -1345,7 +1345,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8feb87a63249689640ac9c011742c33139204e3c134293d3054022276869133b" dependencies = [ "either", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 2.0.2", "log", "num-traits 0.2.11", @@ -1356,9 +1356,9 @@ dependencies = [ [[package]] name = "fixed-hash" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11498d382790b7a8f2fd211780bec78619bba81cdad3a283997c0c41f836759c" +checksum = "32529fc42e86ec06e5047092082aab9ad459b070c5d2a76b14f4f5ce70bf2e84" dependencies = [ "byteorder 1.3.4", "rand 0.7.3", @@ -1393,14 +1393,14 @@ checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" [[package]] name = "fork-tree" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", ] [[package]] name = "frame-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -1416,7 +1416,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1433,7 +1433,7 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -1453,7 +1453,7 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-dev" +version = "11.0.0-rc1" dependencies = [ "parity-scale-codec", "serde", @@ -1463,7 +1463,7 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "bitmask", "frame-metadata", @@ -1489,37 +1489,37 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support-procedural-tools", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "frame-support-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "parity-scale-codec", @@ -1536,7 +1536,7 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "criterion 0.2.11", "frame-support", @@ -1554,7 +1554,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -1569,7 +1569,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -1633,9 +1633,9 @@ checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" [[package]] name = "futures" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e05b85ec287aac0dc34db7d4a569323df697f9c55b99b15d6b4ef8cde49f613" +checksum = "5c329ae8753502fb44ae4fc2b622fa2a94652c41e795143765ba0927f92ab780" dependencies = [ "futures-channel", "futures-core", @@ -1648,9 +1648,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +checksum = "f0c77d04ce8edd9cb903932b608268b3fffec4163dc053b3b402bf47eac1f1a8" dependencies = [ "futures-core", "futures-sink", @@ -1667,9 +1667,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" +checksum = "f25592f769825e89b92358db00d26f965761e094951ac44d3663ef25b7ac464a" [[package]] name = "futures-core-preview" @@ -1694,7 +1694,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdcef58a173af8148b182684c9f2d5250875adbcaff7b5794073894f9d8634a9" dependencies = [ "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.4", "lazy_static", "log", "parking_lot 0.9.0", @@ -1705,9 +1705,9 @@ dependencies = [ [[package]] name = "futures-executor" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d6bb888be1153d3abeb9006b11b02cf5e9b209fda28693c31ae1e4e012e314" +checksum = "f674f3e1bcb15b37284a90cedf55afdba482ab061c407a9c0ebbd0f3109741ba" dependencies = [ "futures-core", "futures-task", @@ -1717,36 +1717,33 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" +checksum = "a638959aa96152c7a4cddf50fcb1e3fede0583b27157c26e67d6f99904090dc6" [[package]] name = "futures-macro" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" +checksum = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" dependencies = [ "proc-macro-hack", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "futures-sink" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" +checksum = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" [[package]] name = "futures-task" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" -dependencies = [ - "once_cell", -] +checksum = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" [[package]] name = "futures-timer" @@ -1766,9 +1763,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.5" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +checksum = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" dependencies = [ "futures 0.1.29", "futures-channel", @@ -1778,7 +1775,6 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project", "pin-utils", "proc-macro-hack", "proc-macro-nested", @@ -1804,7 +1800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0a73299e4718f5452e45980fc1d6957a070abe308d3700b63b8673f47e1c2b3" dependencies = [ "bytes 0.5.4", - "futures 0.3.5", + "futures 0.3.4", "memchr", "pin-project", ] @@ -1872,12 +1868,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "gimli" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" - [[package]] name = "glob" version = "0.2.11" @@ -1947,9 +1937,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.2.5" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b7246d7e4b979c03fa093da39cfb3617a96bbeee6310af63991668d7e843ff" +checksum = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42" dependencies = [ "bytes 0.5.4", "fnv", @@ -1960,7 +1950,7 @@ dependencies = [ "indexmap", "log", "slab", - "tokio 0.2.21", + "tokio 0.2.18", "tokio-util", ] @@ -2000,9 +1990,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.12" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61565ff7aaace3525556587bd2dc31d4a07071957be715e63ce7b1eccf51a8f4" +checksum = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e" dependencies = [ "libc", ] @@ -2155,15 +2145,15 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.5" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" +checksum = "ed6081100e960d9d74734659ffc9cc91daf1c0fc7aceb8eaa94ee1a3f5046f2e" dependencies = [ "bytes 0.5.4", "futures-channel", "futures-core", "futures-util", - "h2 0.2.5", + "h2 0.2.4", "http 0.2.1", "http-body 0.3.1", "httparse", @@ -2172,7 +2162,7 @@ dependencies = [ "net2", "pin-project", "time", - "tokio 0.2.21", + "tokio 0.2.18", "tower-service", "want 0.3.0", ] @@ -2186,11 +2176,11 @@ dependencies = [ "bytes 0.5.4", "ct-logs", "futures-util", - "hyper 0.13.5", + "hyper 0.13.4", "log", "rustls", "rustls-native-certs", - "tokio 0.2.21", + "tokio 0.2.18", "tokio-rustls", "webpki", ] @@ -2246,9 +2236,9 @@ dependencies = [ [[package]] name = "impl-serde" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b47ca4d2b6931707a55fce5cf66aff80e2178c8b63bbb4ecb5695cbc870ddf6f" +checksum = "5bbe9ea9b182f0fb1cabbd61f4ff9b7b7b9197955e95a7e4c27de5055eb29ff8" dependencies = [ "serde", ] @@ -2260,8 +2250,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef5550a42e3740a0e71f909d4c861056a284060af885ae7aa6242820f920d9d" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -2285,7 +2275,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64fa110ec7b8f493f416eed552740d10e7030ad5f63b2308f82c9608ec2df275" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "futures-timer 2.0.2", ] @@ -2319,15 +2309,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "0.4.5" @@ -2345,9 +2326,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.39" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" +checksum = "6a27d435371a2fa5b6d2b028a74bbdb1234f308da363226a2854ca3ff8ba7055" dependencies = [ "wasm-bindgen", ] @@ -2399,8 +2380,8 @@ checksum = "8609af8f63b626e8e211f52441fcdb6ec54f1a446606b10d5c89ae9bf8a20058" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -2489,9 +2470,9 @@ dependencies = [ [[package]] name = "kv-log-macro" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2d3beed37e5483887d81eb39de6de03a8346531410e1306ca48a9a89bd3a51" +checksum = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" dependencies = [ "log", ] @@ -2541,7 +2522,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c7f36acb1841d4c701d30ae1f2cfd242e805991443f75f6935479ed3de64903" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "js-sys", "kvdb", "kvdb-memorydb", @@ -2572,28 +2553,22 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.70" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" +checksum = "99e85c08494b21a9054e7fe1374a732aeadaff3980b6990b94bfd3a70f690005" [[package]] name = "libflate" -version = "1.0.0" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fbe6b967a94346446d37ace319ae85be7eca261bb8149325811ac435d35d64" +checksum = "d9135df43b1f5d0e333385cb6e7897ecd1a43d7d11b91ac003f4d2c2d2401fdd" dependencies = [ "adler32", "crc32fast", - "libflate_lz77", "rle-decode-fast", + "take_mut", ] -[[package]] -name = "libflate_lz77" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3286f09f7d4926fc486334f28d8d2e6ebe4f7f9994494b6dab27ddfad2c9b11b" - [[package]] name = "libloading" version = "0.5.2" @@ -2617,7 +2592,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "057eba5432d3e740e313c6e13c9153d0cb76b4f71bfc2e5242ae5bdb7d41af67" dependencies = [ "bytes 0.5.4", - "futures 0.3.5", + "futures 0.3.4", "lazy_static", "libp2p-core", "libp2p-core-derive", @@ -2659,7 +2634,7 @@ dependencies = [ "ed25519-dalek", "either", "fnv", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "lazy_static", "libsecp256k1", @@ -2688,8 +2663,8 @@ version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f09548626b737ed64080fde595e06ce1117795b8b9fc4d2629fa36561c583171" dependencies = [ - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -2699,7 +2674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c4acff33f5bfe154bafe14c6c08655d4b1e1736afaca78014111bc1742a2016" dependencies = [ "flate2", - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", ] @@ -2709,7 +2684,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3cc186d9a941fd0207cf8f08ef225a735e2d7296258f570155e525f6ee732f87" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "log", ] @@ -2722,7 +2697,7 @@ checksum = "c6dd8cc558e0edde2d4a423d017efd6b36c1b6bf97f4304c83076895c5edaed8" dependencies = [ "cuckoofilter", "fnv", - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "libp2p-swarm", "prost", @@ -2741,7 +2716,7 @@ dependencies = [ "byteorder 1.3.4", "bytes 0.5.4", "fnv", - "futures 0.3.5", + "futures 0.3.4", "futures_codec", "libp2p-core", "libp2p-swarm", @@ -2762,7 +2737,7 @@ version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6438ed8ca240c7635c9caa3be6c5258bc0058553ae97ba81737f04e5d33804f5" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "libp2p-swarm", "log", @@ -2782,7 +2757,7 @@ dependencies = [ "bytes 0.5.4", "either", "fnv", - "futures 0.3.5", + "futures 0.3.4", "futures_codec", "libp2p-core", "libp2p-swarm", @@ -2809,7 +2784,7 @@ dependencies = [ "data-encoding", "dns-parser", "either", - "futures 0.3.5", + "futures 0.3.4", "lazy_static", "libp2p-core", "libp2p-swarm", @@ -2829,7 +2804,7 @@ checksum = "34ce63313ad4bce2d76e54c292a1293ea47a0ebbe16708f1513fa62184992f53" dependencies = [ "bytes 0.5.4", "fnv", - "futures 0.3.5", + "futures 0.3.4", "futures_codec", "libp2p-core", "log", @@ -2844,7 +2819,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84fd504e27b0eadd451e06b67694ef714bd8374044e7db339bb0cdb83755ddf4" dependencies = [ "curve25519-dalek", - "futures 0.3.5", + "futures 0.3.4", "lazy_static", "libp2p-core", "log", @@ -2864,7 +2839,7 @@ version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c189cf1dfe4b3f01e2c0fe5e97a6f5df8aeb6f3569e26981015eb7c08015ce5f" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "libp2p-swarm", "log", @@ -2880,7 +2855,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad28fe7beaa3e516ee8ba2af8c4f6820f269afa60d661831e879f2afea64f4a0" dependencies = [ "bytes 0.5.4", - "futures 0.3.5", + "futures 0.3.4", "futures_codec", "libp2p-core", "log", @@ -2897,7 +2872,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dabaa2194e1ce3c51cd78d734dd4c81dc5c7b150b309cbf9029df044034ac261" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "log", "pin-project", "rand 0.7.3", @@ -2913,7 +2888,7 @@ checksum = "7b73f0cc119c83a5b619d6d11074a319fdb4aa4daf8088ade00d511418566e28" dependencies = [ "aes-ctr", "ctr", - "futures 0.3.5", + "futures 0.3.4", "hmac", "js-sys", "lazy_static", @@ -2941,7 +2916,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4a8101a0e0d5f04562137a476bf5f5423cd5bdab2f7e43a75909668e63cb102" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "log", "rand 0.7.3", @@ -2957,7 +2932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "309f95fce9bec755eff5406f8b822fd3969990830c2b54f752e1fc181d5ace3e" dependencies = [ "async-std", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "get_if_addrs", "ipnet", @@ -2973,7 +2948,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78d51726e063e8d73b103331576bb7e8fad187a3f0c227933a10b3542e2ad3f4" dependencies = [ "async-std", - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "log", ] @@ -2984,7 +2959,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f59fdbb5706f2723ca108c088b1c7a37f735a8c328021f0508007162627e9885" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "js-sys", "libp2p-core", "parity-send-wrapper", @@ -3001,7 +2976,7 @@ dependencies = [ "async-tls", "bytes 0.5.4", "either", - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "log", "quicksink", @@ -3019,7 +2994,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b305d3a8981e68f11c0e17f2d11d5c52fae95e0d7c283f9e462b5b2dab413b2" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "libp2p-core", "parking_lot 0.10.2", "thiserror", @@ -3068,9 +3043,9 @@ dependencies = [ [[package]] name = "linked-hash-map" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" +checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" [[package]] name = "linked_hash_set" @@ -3224,9 +3199,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.22" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" +checksum = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" dependencies = [ "cfg-if", "fuchsia-zircon", @@ -3255,9 +3230,9 @@ dependencies = [ [[package]] name = "mio-uds" -version = "0.6.8" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +checksum = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" dependencies = [ "iovec", "libc", @@ -3310,7 +3285,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74cdcf7cfb3402881e15a1f95116cb033d69b33c83d481e1234777f5ef0c3d2c" dependencies = [ "bytes 0.5.4", - "futures 0.3.5", + "futures 0.3.4", "log", "pin-project", "smallvec 1.4.0", @@ -3345,9 +3320,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.34" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ba7c918ac76704fb42afcbbb43891e72731f3dcca3bef2a19786297baf14af7" +checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" dependencies = [ "cfg-if", "libc", @@ -3383,7 +3358,7 @@ dependencies = [ [[package]] name = "node-bench" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "fs_extra", @@ -3413,9 +3388,9 @@ dependencies = [ [[package]] name = "node-browser-testing" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "jsonrpc-core", "libp2p", @@ -3430,13 +3405,13 @@ dependencies = [ [[package]] name = "node-cli" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "assert_cmd", "frame-benchmarking-cli", "frame-support", "frame-system", - "futures 0.3.5", + "futures 0.3.4", "hex-literal", "jsonrpc-core", "log", @@ -3504,9 +3479,9 @@ dependencies = [ [[package]] name = "node-executor" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "criterion 0.3.2", + "criterion 0.3.1", "frame-benchmarking", "frame-support", "frame-system", @@ -3538,7 +3513,7 @@ dependencies = [ [[package]] name = "node-inspect" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "log", @@ -3554,7 +3529,7 @@ dependencies = [ [[package]] name = "node-primitives" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-system", "parity-scale-codec", @@ -3567,7 +3542,7 @@ dependencies = [ [[package]] name = "node-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "jsonrpc-core", "node-primitives", @@ -3593,7 +3568,7 @@ dependencies = [ [[package]] name = "node-rpc-client" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "env_logger 0.7.1", "futures 0.1.29", @@ -3606,7 +3581,7 @@ dependencies = [ [[package]] name = "node-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-executive", @@ -3672,9 +3647,9 @@ dependencies = [ [[package]] name = "node-template" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "log", "node-template-runtime", "parking_lot 0.10.2", @@ -3701,7 +3676,7 @@ dependencies = [ [[package]] name = "node-template-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-executive", "frame-support", @@ -3733,13 +3708,13 @@ dependencies = [ [[package]] name = "node-testing" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "criterion 0.3.2", + "criterion 0.3.1", "frame-support", "frame-system", "fs_extra", - "futures 0.3.5", + "futures 0.3.4", "log", "node-executor", "node-primitives", @@ -3801,9 +3776,9 @@ dependencies = [ [[package]] name = "ntapi" -version = "0.3.4" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a31937dea023539c72ddae0e3571deadc1414b300483fa7aaec176168cfa9d2" +checksum = "f26e041cd983acbc087e30fcba770380cfa352d0e392e175b2344ebaf7ea0602" dependencies = [ "winapi 0.3.8", ] @@ -3872,9 +3847,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" dependencies = [ "hermit-abi", "libc", @@ -3889,26 +3864,20 @@ dependencies = [ "target-lexicon", ] -[[package]] -name = "object" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2" - [[package]] name = "once_cell" -version = "1.4.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" +checksum = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" dependencies = [ - "parking_lot 0.10.2", + "parking_lot 0.9.0", ] [[package]] name = "oorandom" -version = "11.1.1" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" +checksum = "ebcec7c9c2a95cacc7cd0ecb89d8a8454eca13906f6deb55258ffff0adeb9405" [[package]] name = "opaque-debug" @@ -3942,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-assets" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -3956,7 +3925,7 @@ dependencies = [ [[package]] name = "pallet-aura" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -3978,7 +3947,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -3996,7 +3965,7 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4012,7 +3981,7 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4034,7 +4003,7 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4050,7 +4019,7 @@ dependencies = [ [[package]] name = "pallet-benchmark" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4064,7 +4033,7 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4081,7 +4050,7 @@ dependencies = [ [[package]] name = "pallet-contracts" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "assert_matches", "frame-support", @@ -4107,7 +4076,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -4116,7 +4085,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4135,7 +4104,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4146,7 +4115,7 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4166,7 +4135,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4182,7 +4151,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4201,7 +4170,7 @@ dependencies = [ [[package]] name = "pallet-evm" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "evm", "frame-support", @@ -4221,7 +4190,7 @@ dependencies = [ [[package]] name = "pallet-example" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4237,7 +4206,7 @@ dependencies = [ [[package]] name = "pallet-example-offchain-worker" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4252,7 +4221,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4269,7 +4238,7 @@ dependencies = [ [[package]] name = "pallet-generic-asset" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4283,7 +4252,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "finality-grandpa", "frame-support", @@ -4310,7 +4279,7 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4327,7 +4296,7 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4346,7 +4315,7 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4362,7 +4331,7 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4376,7 +4345,7 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4391,7 +4360,7 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4407,7 +4376,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4432,7 +4401,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4446,7 +4415,7 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "enumflags2", "frame-support", @@ -4462,7 +4431,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4477,7 +4446,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4492,7 +4461,7 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4513,7 +4482,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4533,7 +4502,7 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4549,7 +4518,7 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "env_logger 0.7.1", "frame-benchmarking", @@ -4600,18 +4569,18 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.5", + "quote 1.0.3", "sp-runtime", - "syn 1.0.21", + "syn 1.0.17", ] [[package]] name = "pallet-sudo" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4625,7 +4594,7 @@ dependencies = [ [[package]] name = "pallet-template" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4637,7 +4606,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4655,7 +4624,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", @@ -4672,7 +4641,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4689,7 +4658,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "parity-scale-codec", @@ -4702,7 +4671,7 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4718,7 +4687,7 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-benchmarking", "frame-support", @@ -4734,7 +4703,7 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4837,8 +4806,8 @@ checksum = "5a0ec292e92e8ec7c58e576adacc1e3f399c597c8f263c42f18420abe58e7245" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -4869,7 +4838,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ "proc-macro2", - "syn 1.0.21", + "syn 1.0.17", "synstructure", ] @@ -4906,7 +4875,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" dependencies = [ "lock_api", - "parking_lot_core 0.7.2", + "parking_lot_core 0.7.1", ] [[package]] @@ -4926,9 +4895,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +checksum = "0e136c1904604defe99ce5fd71a28d473fa60a12255d511aa78a9ddf11237aeb" dependencies = [ "cfg-if", "cloudabi", @@ -4940,9 +4909,9 @@ dependencies = [ [[package]] name = "paste" -version = "0.1.12" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a229b1c58c692edcaa5b9b0948084f130f55d2dcc15b02fcc5340b2b4521476" +checksum = "ab4fb1930692d1b6a9cfabdde3d06ea0a7d186518e2f4d67660d8970e2fa647a" dependencies = [ "paste-impl", "proc-macro-hack", @@ -4950,14 +4919,14 @@ dependencies = [ [[package]] name = "paste-impl" -version = "0.1.12" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0bf239e447e67ff6d16a8bb5e4d4bd2343acf5066061c0e8e06ac5ba8ca68c" +checksum = "a62486e111e571b1e93b710b61e8f493c0013be39629b714cb166bdb06aa5a8a" dependencies = [ "proc-macro-hack", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -5006,35 +4975,35 @@ dependencies = [ [[package]] name = "pin-project" -version = "0.4.16" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d480cb4e89522ccda96d0eed9af94180b7a5f93fb28f66e1fd7d68431663d1" +checksum = "6f6a7f5eee6292c559c793430c55c00aea9d3b3d1905e855806ca4d7253426a2" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "0.4.16" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82996f11efccb19b685b14b5df818de31c1edcee3daa256ab5775dd98e72feb" +checksum = "8988430ce790d8682672117bc06dda364c0be32d3abd738234f19f3240bad99a" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "pin-project-lite" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7505eeebd78492e0f6108f7171c4948dbb120ee8119d9d77d0afa5469bef67f" +checksum = "237844750cfbb86f67afe27eee600dfbbcb6188d734139b534cbfbf4f96792ae" [[package]] name = "pin-utils" -version = "0.1.0" +version = "0.1.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "5894c618ce612a3fa23881b152b608bafb8c56cfc22f434a3ba3120b40f7b587" [[package]] name = "pkg-config" @@ -5056,9 +5025,9 @@ checksum = "feb3b2b1033b8a60b4da6ee470325f887758c95d5320f52f9ce0df055a55940e" [[package]] name = "plotters" -version = "0.2.14" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9b1d9ca091d370ea3a78d5619145d1b59426ab0c9eedbad2514a4cee08bf389" +checksum = "4e3bb8da247d27ae212529352020f3e5ee16e83c0c258061d27b08ab92675eeb" dependencies = [ "js-sys", "num-traits 0.2.11", @@ -5112,14 +5081,14 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.7.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55c21c64d0eaa4d7ed885d959ef2d62d9e488c27c0e02d9aa5ce6c877b7d5f8" +checksum = "e5e4b9943a2da369aec5e96f7c10ebc74fcf434d39590d974b0a3460e6f67fbb" dependencies = [ "fixed-hash", "impl-codec", "impl-rlp", - "impl-serde 0.3.1", + "impl-serde 0.3.0", "uint", ] @@ -5140,8 +5109,8 @@ checksum = "98e9e4b82e0ef281812565ea4751049f1bdcdfccda7d3f459f2e138a40c08678" dependencies = [ "proc-macro-error-attr", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "version_check", ] @@ -5152,8 +5121,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f5444ead4e9935abd7f27dc51f7e852a0569ac888096d5ec2499470794e2e53" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "syn-mid", "version_check", ] @@ -5172,18 +5141,18 @@ checksum = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" [[package]] name = "proc-macro2" -version = "1.0.12" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8872cf6f48eee44265156c111456a700ab3483686b3f96df4cf5481c89157319" +checksum = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" dependencies = [ "unicode-xid 0.2.0", ] [[package]] name = "procfs" -version = "0.7.9" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c434e93ef69c216e68e4f417c927b4f31502c3560b72cfdb6827e2321c5c6b3e" +checksum = "fe50036aa1b71e553a4a0c48ab7baabf8aa8c7a5a61aae06bf38c2eab7430475" dependencies = [ "bitflags", "byteorder 1.3.4", @@ -5226,7 +5195,7 @@ checksum = "02b10678c913ecbd69350e8535c3aef91a8676c0773fc1d7b95cdd196d7f2f26" dependencies = [ "bytes 0.5.4", "heck", - "itertools 0.8.2", + "itertools", "log", "multimap", "petgraph", @@ -5243,10 +5212,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "537aa19b95acde10a12fec4301466386f757403de4cd4e5b4fa78fb5ecb18f72" dependencies = [ "anyhow", - "itertools 0.8.2", + "itertools", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -5313,9 +5282,9 @@ checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" [[package]] name = "quote" -version = "1.0.5" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42934bc9c8ab0d3b273a16d8551c8f0fcff46be73276ca083ec2414c15c4ba5e" +checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" dependencies = [ "proc-macro2", ] @@ -5613,8 +5582,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "602eb59cda66fcb9aec25841fb76bc01d2b34282dcdd705028da297db6f3eec8" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -5630,9 +5599,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.3.7" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" +checksum = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3" dependencies = [ "aho-corasick", "memchr", @@ -5678,13 +5647,13 @@ dependencies = [ [[package]] name = "ring" -version = "0.16.13" +version = "0.16.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703516ae74571f24b465b4a1431e81e2ad51336cb0ded733a55a1aa3eccac196" +checksum = "1ba5a8ec64ee89a76c98c549af81ff14813df09c3e6dc4766c3856da48597a0c" dependencies = [ "cc", + "lazy_static", "libc", - "once_cell", "spin", "untrusted", "web-sys", @@ -5797,8 +5766,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bba175698996010c4f6dce5e7f173b6eb781fce25d2cfc45e27091ce0b79f6" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -5807,16 +5776,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4da5fcb054c46f5a5dff833b129285a93d3f0179531735e6c866e8cc307d2020" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "pin-project", "static_assertions", ] [[package]] name = "ryu" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" +checksum = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" [[package]] name = "safe-mix" @@ -5858,12 +5827,12 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "bytes 0.5.4", "derive_more", "env_logger 0.7.1", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "libp2p", "log", @@ -5888,9 +5857,9 @@ dependencies = [ [[package]] name = "sc-basic-authorship" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -5914,7 +5883,7 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5931,7 +5900,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5946,17 +5915,17 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "sc-cli" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5965,7 +5934,7 @@ dependencies = [ "directories", "env_logger 0.7.1", "fdlimit", - "futures 0.3.5", + "futures 0.3.4", "lazy_static", "log", "names", @@ -5992,16 +5961,16 @@ dependencies = [ "substrate-prometheus-endpoint", "tempfile", "time", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] name = "sc-client-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", "fnv", - "futures 0.3.5", + "futures 0.3.4", "hash-db", "hex-literal", "kvdb", @@ -6035,7 +6004,7 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "blake2-rfc", "env_logger 0.7.1", @@ -6068,7 +6037,7 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6078,11 +6047,11 @@ dependencies = [ [[package]] name = "sc-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "env_logger 0.7.1", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -6116,12 +6085,12 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "env_logger 0.7.1", "fork-tree", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "log", "merlin", @@ -6166,10 +6135,10 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", - "futures 0.3.5", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6194,7 +6163,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6206,12 +6175,12 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "assert_matches", "derive_more", "env_logger 0.7.1", - "futures 0.3.5", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6231,15 +6200,15 @@ dependencies = [ "substrate-test-runtime-client", "substrate-test-runtime-transaction-pool", "tempfile", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] name = "sc-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", - "futures 0.3.5", + "futures 0.3.4", "log", "parity-scale-codec", "sc-client-api", @@ -6257,9 +6226,9 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -6279,7 +6248,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "log", "sc-client-api", @@ -6292,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "assert_matches", "derive_more", @@ -6327,7 +6296,7 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "log", @@ -6343,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "log", "parity-scale-codec", @@ -6357,7 +6326,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "assert_matches", "cranelift-codegen", @@ -6378,14 +6347,14 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "assert_matches", "derive_more", "env_logger 0.7.1", "finality-grandpa", "fork-tree", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "log", "parity-scale-codec", @@ -6417,16 +6386,16 @@ dependencies = [ "substrate-prometheus-endpoint", "substrate-test-runtime-client", "tempfile", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "finality-grandpa", - "futures 0.3.5", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6439,10 +6408,10 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "ansi_term 0.12.1", - "futures 0.3.5", + "futures 0.3.4", "log", "parity-util-mem", "sc-client-api", @@ -6455,7 +6424,7 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", "hex", @@ -6470,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "assert_matches", "async-std", @@ -6483,7 +6452,7 @@ dependencies = [ "erased-serde", "fnv", "fork-tree", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "futures_codec", "hex", @@ -6530,10 +6499,10 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "async-std", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "libp2p", "log", @@ -6548,10 +6517,10 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "env_logger 0.7.1", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "libp2p", "log", @@ -6574,15 +6543,15 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "bytes 0.5.4", "env_logger 0.7.1", "fdlimit", "fnv", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", - "hyper 0.13.5", + "hyper 0.13.4", "hyper-rustls", "log", "num_cpus", @@ -6602,14 +6571,14 @@ dependencies = [ "sp-utils", "substrate-test-runtime-client", "threadpool", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] name = "sc-peerset" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "libp2p", "log", "rand 0.7.3", @@ -6620,7 +6589,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -6628,11 +6597,11 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "assert_matches", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.4", "hash-db", "jsonrpc-core", "jsonrpc-pubsub", @@ -6667,10 +6636,10 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", - "futures 0.3.5", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -6690,7 +6659,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6704,7 +6673,7 @@ dependencies = [ [[package]] name = "sc-runtime-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "sp-allocator", "sp-core", @@ -6717,12 +6686,12 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", "exit-future", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "hash-db", "lazy_static", @@ -6778,12 +6747,12 @@ dependencies = [ [[package]] name = "sc-service-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "env_logger 0.7.1", "fdlimit", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.4", "hex-literal", "log", "parity-scale-codec", @@ -6813,7 +6782,7 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "env_logger 0.7.1", "log", @@ -6827,10 +6796,10 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "bytes 0.5.4", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "libp2p", "log", @@ -6848,7 +6817,7 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "erased-serde", "log", @@ -6863,12 +6832,12 @@ dependencies = [ [[package]] name = "sc-transaction-graph" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "assert_matches", - "criterion 0.3.2", + "criterion 0.3.1", "derive_more", - "futures 0.3.5", + "futures 0.3.4", "linked-hash-map", "log", "parity-scale-codec", @@ -6886,11 +6855,11 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "assert_matches", "derive_more", - "futures 0.3.5", + "futures 0.3.4", "futures-diagnose", "hex", "intervalier", @@ -6916,9 +6885,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "039c25b130bd8c1321ee2d7de7fde2659fa9c2744e4bb29711cfc852ea53cd19" dependencies = [ "lazy_static", "winapi 0.3.8", @@ -6965,13 +6934,13 @@ dependencies = [ [[package]] name = "scroll_derive" -version = "0.10.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e367622f934864ffa1c704ba2b82280aab856e3d8213c84c5720257eb34b15b9" +checksum = "f8584eea9b9ff42825b46faf46a8c24d2cff13ec152fa2a50df788b87c07ee28" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -6986,9 +6955,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "0.4.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" +checksum = "572dfa3a0785509e7a44b5b4bebcf94d41ba34e9ed9eb9df722545c3b3c4144a" dependencies = [ "bitflags", "core-foundation", @@ -6999,9 +6968,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" +checksum = "8ddb15a5fec93b7021b8a9e96009c5d8d51c15673569f7c0f6b7204e5b7b404f" dependencies = [ "core-foundation-sys", "libc", @@ -7052,29 +7021,29 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.110" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" +checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.110" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" +checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "serde_json" -version = "1.0.53" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +checksum = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9" dependencies = [ "itoa", "ryu", @@ -7186,8 +7155,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a945ec7f7ce853e89ffa36be1e27dce9a43e82ff9093bf3461c30d5da74ed11b" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -7244,7 +7213,7 @@ dependencies = [ "base64 0.11.0", "bytes 0.5.4", "flate2", - "futures 0.3.5", + "futures 0.3.4", "http 0.2.1", "httparse", "log", @@ -7257,7 +7226,7 @@ dependencies = [ [[package]] name = "sp-allocator" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", "log", @@ -7268,7 +7237,7 @@ dependencies = [ [[package]] name = "sp-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "hash-db", "parity-scale-codec", @@ -7283,20 +7252,20 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "blake2-rfc", "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "sp-api-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "criterion 0.3.2", + "criterion 0.3.1", "parity-scale-codec", "rustversion", "sc-block-builder", @@ -7313,7 +7282,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "serde", @@ -7324,7 +7293,7 @@ dependencies = [ [[package]] name = "sp-application-crypto-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "sp-api", "sp-application-crypto", @@ -7335,9 +7304,9 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "criterion 0.3.2", + "criterion 0.3.1", "integer-sqrt", "num-traits 0.2.11", "parity-scale-codec", @@ -7351,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-arithmetic-fuzzer" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "honggfuzz", "num-bigint", @@ -7362,7 +7331,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7373,7 +7342,7 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7383,7 +7352,7 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7394,7 +7363,7 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", "log", @@ -7409,7 +7378,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "serde", "serde_json", @@ -7417,10 +7386,10 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "derive_more", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "libp2p", "log", @@ -7440,7 +7409,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7453,7 +7422,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "merlin", "parity-scale-codec", @@ -7469,7 +7438,7 @@ dependencies = [ [[package]] name = "sp-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7480,7 +7449,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7491,7 +7460,7 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "base58", "blake2-rfc", @@ -7499,12 +7468,12 @@ dependencies = [ "criterion 0.2.11", "derive_more", "ed25519-dalek", - "futures 0.3.5", + "futures 0.3.4", "hash-db", "hash256-std-hasher", "hex", "hex-literal", - "impl-serde 0.3.1", + "impl-serde 0.3.0", "lazy_static", "libsecp256k1", "log", @@ -7537,7 +7506,7 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7545,16 +7514,16 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "sp-externalities" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "environmental", "parity-scale-codec", @@ -7564,7 +7533,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "finality-grandpa", "log", @@ -7579,7 +7548,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7588,7 +7557,7 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", "parity-scale-codec", @@ -7599,9 +7568,9 @@ dependencies = [ [[package]] name = "sp-io" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "hash-db", "libsecp256k1", "log", @@ -7618,7 +7587,7 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "lazy_static", "sp-core", @@ -7628,7 +7597,7 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "sp-api", "sp-core", @@ -7638,7 +7607,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "backtrace", "log", @@ -7646,7 +7615,7 @@ dependencies = [ [[package]] name = "sp-phragmen" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "rand 0.7.3", @@ -7661,12 +7630,12 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -7682,7 +7651,7 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "serde", "serde_json", @@ -7691,7 +7660,7 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "hash256-std-hasher", "impl-trait-for-tuples", @@ -7713,7 +7682,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7733,18 +7702,18 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "Inflector", "proc-macro-crate", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "sp-runtime-interface-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "sc-executor", "sp-core", @@ -7759,7 +7728,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "sp-core", "sp-io", @@ -7770,7 +7739,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "sp-core", "sp-io", @@ -7781,7 +7750,7 @@ dependencies = [ [[package]] name = "sp-sandbox" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "assert_matches", "parity-scale-codec", @@ -7795,7 +7764,7 @@ dependencies = [ [[package]] name = "sp-serializer" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "serde", "serde_json", @@ -7803,7 +7772,7 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-api", @@ -7815,7 +7784,7 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7824,7 +7793,7 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "hash-db", "hex-literal", @@ -7844,11 +7813,11 @@ dependencies = [ [[package]] name = "sp-std" -version = "2.0.0-dev" +version = "2.0.0-rc1" [[package]] name = "sp-storage" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7859,7 +7828,7 @@ dependencies = [ [[package]] name = "sp-test-primitives" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "parity-scale-codec", "parity-util-mem", @@ -7871,7 +7840,7 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7884,17 +7853,17 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "tracing", ] [[package]] name = "sp-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", - "futures 0.3.5", + "futures 0.3.4", "log", "parity-scale-codec", "serde", @@ -7905,7 +7874,7 @@ dependencies = [ [[package]] name = "sp-trie" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "criterion 0.2.11", "hash-db", @@ -7923,9 +7892,9 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "futures-core", "lazy_static", "prometheus", @@ -7933,7 +7902,7 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7944,7 +7913,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8014,9 +7983,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" -version = "0.3.14" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863246aaf5ddd0d6928dfeb1a9ca65f505599e4e1b399935ef7e75107516b4ef" +checksum = "ff6da2e8d107dfd7b74df5ef4d205c6aebee0706c647f6bc6a2d5789905c00fb" dependencies = [ "clap", "lazy_static", @@ -8025,15 +7994,15 @@ dependencies = [ [[package]] name = "structopt-derive" -version = "0.4.7" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d239ca4b13aee7a2142e6795cbd69e457665ff8037aed33b3effdc430d2f927a" +checksum = "a489c87c08fbaf12e386665109dd13470dcc9c4583ea3e10dd2b4523e5ebd9ac" dependencies = [ "heck", "proc-macro-error", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -8053,13 +8022,13 @@ checksum = "0054a7df764039a6cd8592b9de84be4bec368ff081d203a7d5371cbfa8e65c81" dependencies = [ "heck", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] name = "subkey" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "clap", "derive_more", @@ -8068,7 +8037,7 @@ dependencies = [ "hex", "hex-literal", "hyper 0.12.35", - "itertools 0.8.2", + "itertools", "jsonrpc-core-client", "libp2p", "node-primitives", @@ -8101,14 +8070,14 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "chrono", "clear_on_drop", "console_error_panic_hook", "console_log", "futures 0.1.29", - "futures 0.3.5", + "futures 0.3.4", "futures-timer 3.0.2", "js-sys", "kvdb-web", @@ -8127,34 +8096,34 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-support" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "frame-support", "frame-system", - "futures 0.3.5", + "futures 0.3.4", "jsonrpc-client-transports", "jsonrpc-core", "parity-scale-codec", "sc-rpc-api", "serde", "sp-storage", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "env_logger 0.7.1", "frame-system-rpc-runtime-api", - "futures 0.3.5", + "futures 0.3.4", "jsonrpc-core", "jsonrpc-core-client", "jsonrpc-derive", @@ -8173,22 +8142,22 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-dev" +version = "0.8.0-rc1" dependencies = [ "async-std", "derive_more", "futures-util", - "hyper 0.13.5", + "hyper 0.13.4", "log", "prometheus", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] name = "substrate-test-client" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "hash-db", "parity-scale-codec", "sc-client-api", @@ -8206,7 +8175,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "cfg-if", "frame-executive", @@ -8249,9 +8218,9 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "parity-scale-codec", "sc-block-builder", "sc-client-api", @@ -8268,10 +8237,10 @@ dependencies = [ [[package]] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "derive_more", - "futures 0.3.5", + "futures 0.3.4", "parity-scale-codec", "parking_lot 0.10.2", "sc-transaction-graph", @@ -8283,7 +8252,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" -version = "2.0.0-dev" +version = "2.0.0-rc1" [[package]] name = "substrate-wasm-builder" @@ -8293,7 +8262,7 @@ dependencies = [ "build-helper", "cargo_metadata", "fs2", - "itertools 0.8.2", + "itertools", "tempfile", "toml", "walkdir", @@ -8340,7 +8309,7 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "cranelift-wasm", - "gimli 0.20.0", + "gimli", "log", "more-asserts", "region", @@ -8362,10 +8331,10 @@ checksum = "c77f0ce539b5a09a54dc80a1cf0c7cd7e694df11029354fe50a2d5fe889bdb97" dependencies = [ "anyhow", "cfg-if", - "gimli 0.20.0", + "gimli", "lazy_static", "libc", - "object 0.18.0", + "object", "scroll", "serde", "substrate-wasmtime-runtime", @@ -8418,12 +8387,12 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.21" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4696caa4048ac7ce2bcd2e484b3cef88c1004e41b8e945a277e2c25dc0b72060" +checksum = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" dependencies = [ "proc-macro2", - "quote 1.0.5", + "quote 1.0.3", "unicode-xid 0.2.0", ] @@ -8434,8 +8403,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7be3539f6c128a931cf19dcee741c1af532c7fd387baa739c03dd2e96479338a" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -8454,16 +8423,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "unicode-xid 0.2.0", ] [[package]] name = "sysinfo" -version = "0.13.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac193374347e7c263c5f547524f36ff8ec6702d56c8799c8331d26dffe8c1e" +checksum = "5a0338198966bde7feb14b011a33d404a62a6e03b843352c71512a2a002634b7" dependencies = [ "cfg-if", "doc-comment", @@ -8517,8 +8486,8 @@ checksum = "a605baa797821796a751f4a959e1206079b24a4b7e1ed302b7d785d81a9276c9" dependencies = [ "lazy_static", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "version_check", ] @@ -8533,22 +8502,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.17" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "467e5ff447618a916519a4e0d62772ab14f434897f3d63f05d8700ef1e9b22c1" +checksum = "54b3d3d2ff68104100ab257bb6bb0cb26c901abe4bd4ba15961f3bf867924012" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.17" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63c1091225b9834089b429bc4a2e01223470e3183e891582909e9d1c4cb55d9" +checksum = "ca972988113b7715266f91250ddb98070d033c62a011fa0fcc57434a649310dd" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -8562,20 +8531,21 @@ dependencies = [ [[package]] name = "threadpool" -version = "1.8.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +checksum = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" dependencies = [ "num_cpus", ] [[package]] name = "time" -version = "0.1.43" +version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" dependencies = [ "libc", + "redox_syscall", "winapi 0.3.8", ] @@ -8615,9 +8585,9 @@ dependencies = [ [[package]] name = "tinytemplate" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e4bc5ac99433e0dcb8b9f309dd271a165ae37dde129b9e0ce1bfdd8bfe4891" +checksum = "57a3c6667d3e65eb1bc3aed6fd14011c6cbc3a0665218ab7f5daf040b9ec371a" dependencies = [ "serde", "serde_json", @@ -8649,9 +8619,9 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.21" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58" +checksum = "34ef16d072d2b6dc8b4a56c70f5c5ced1a37752116f8e7c1e80c659aa7cb6713" dependencies = [ "bytes 0.5.4", "fnv", @@ -8752,8 +8722,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -8783,7 +8753,7 @@ checksum = "4adb8b3e5f86b707f1b54e7c15b6de52617a823608ccda98a15d3a24222f265a" dependencies = [ "futures-core", "rustls", - "tokio 0.2.21", + "tokio 0.2.18", "webpki", ] @@ -8895,7 +8865,7 @@ dependencies = [ "futures-sink", "log", "pin-project-lite", - "tokio 0.2.21", + "tokio 0.2.18", ] [[package]] @@ -8930,8 +8900,8 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fbad39da2f9af1cae3016339ad7f2c7a9e870f12e8fd04c4fd7ef35b30c0d2b" dependencies = [ - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", ] [[package]] @@ -9005,9 +8975,9 @@ checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "trybuild" -version = "1.0.27" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744665442556a91933cee5e75b0371376eb03498c4d0bfbcebd2a9882b4fb5ef" +checksum = "459186ab1afd6d93bd23c2269125f4f7694f8771fe0e64434b4bdc212b94034d" dependencies = [ "glob 0.3.0", "lazy_static", @@ -9045,9 +9015,9 @@ checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[package]] name = "uint" -version = "0.8.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173cd16430c206dc1a430af8a89a0e9c076cf15cb42b4aedb10e8cc8fee73681" +checksum = "e75a4cdd7b87b28840dba13c483b9a88ee6bbf16ba5c951ee1ecfcf723078e0d" dependencies = [ "byteorder 1.3.4", "crunchy", @@ -9120,9 +9090,9 @@ dependencies = [ [[package]] name = "untrusted" -version = "0.7.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "60369ef7a31de49bcb3f6ca728d4ba7300d9a1658f94c727d4cab8c8d9f4aece" [[package]] name = "url" @@ -9154,9 +9124,9 @@ checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" [[package]] name = "vec_map" -version = "0.8.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" [[package]] name = "version_check" @@ -9262,16 +9232,16 @@ dependencies = [ "lazy_static", "log", "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.12" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a369c5e1dfb7569e14d62af4da642a3cbc2f9a3652fe586e26ac22222aa4b04" +checksum = "7add542ea1ac7fdaa9dc25e031a6af33b7d63376292bd24140c637d00d1c312a" dependencies = [ "cfg-if", "js-sys", @@ -9285,7 +9255,7 @@ version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" dependencies = [ - "quote 1.0.5", + "quote 1.0.3", "wasm-bindgen-macro-support", ] @@ -9296,8 +9266,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -9310,9 +9280,9 @@ checksum = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" [[package]] name = "wasm-bindgen-test" -version = "0.3.12" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd8e9dad8040e378f0696b017570c6bc929aac373180e06b3d67ac5059c52da3" +checksum = "648da3460c6d2aa04b715a936329e2e311180efe650b2127d6267f4193ccac14" dependencies = [ "console_error_panic_hook", "js-sys", @@ -9324,12 +9294,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.12" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c358c8d2507c1bae25efa069e62ea907aa28700b25c8c33dafb0b15ba4603627" +checksum = "cf2f86cd78a2aa7b1fb4bb6ed854eccb7f9263089c79542dca1576a1518a8467" dependencies = [ "proc-macro2", - "quote 1.0.5", + "quote 1.0.3", ] [[package]] @@ -9349,7 +9319,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "324c5e65a08699c9c4334ba136597ab22b85dccd4b65dd1e36ccf8f723a95b54" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "js-sys", "parking_lot 0.9.0", "pin-utils", @@ -9403,7 +9373,7 @@ checksum = "d39ba645aee700b29ff0093028b4123556dd142a74973f04ed6225eedb40e77d" dependencies = [ "anyhow", "faerie", - "gimli 0.20.0", + "gimli", "more-asserts", "target-lexicon", "thiserror", @@ -9418,7 +9388,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed54fd9d64dfeeee7c285fd126174a6b5e6d4efc7e5a1566fdb635e60ff6a74e" dependencies = [ "anyhow", - "base64 0.12.1", + "base64 0.12.0", "bincode", "cranelift-codegen", "cranelift-entity", @@ -9442,27 +9412,27 @@ dependencies = [ [[package]] name = "wast" -version = "17.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a0e1c36b928fca33dbaf96235188f5fad22ee87100e26cc606bd0fbabdf1932" +checksum = "5b20abd8b4a26f7e0d4dd5e357e90a3d555ec190e94472c9b2b27c5b9777f9ae" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.18" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b50f9e5e5c81e6fd987ae6997a9f4bbb751df2dec1d8cadb0b5778f1ec13bbe" +checksum = "51a615830ee3e7200b505c441fec09aac2f114deae69df52f215cb828ba112c4" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.39" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" +checksum = "2d6f51648d8c56c366144378a33290049eafdd784071077f6fe37dae64c1c4cb" dependencies = [ "js-sys", "wasm-bindgen", @@ -9535,9 +9505,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "fa515c5163a99cc82bab70fd3bfdd36d827be85de63737b40fcef2ce084a436e" dependencies = [ "winapi 0.3.8", ] @@ -9593,7 +9563,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84300bb493cc878f3638b981c62b4632ec1a5c52daaa3036651e8c106d3b55ea" dependencies = [ - "futures 0.3.5", + "futures 0.3.4", "log", "nohash-hasher", "parking_lot 0.10.2", @@ -9617,8 +9587,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2" dependencies = [ "proc-macro2", - "quote 1.0.5", - "syn 1.0.21", + "quote 1.0.3", + "syn 1.0.17", "synstructure", ] diff --git a/bin/node-template/node/Cargo.toml b/bin/node-template/node/Cargo.toml index 030672ee6f..4e8b3ff196 100644 --- a/bin/node-template/node/Cargo.toml +++ b/bin/node-template/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Anonymous"] description = "Substrate Node template" edition = "2018" @@ -21,25 +21,25 @@ log = "0.4.8" structopt = "0.3.8" parking_lot = "0.10.0" -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sc-service = { version = "0.8.0-dev", path = "../../../client/service" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -sc-network = { version = "0.8.0-dev", path = "../../../client/network" } -sc-consensus-aura = { version = "0.8.0-dev", path = "../../../client/consensus/aura" } -sp-consensus-aura = { version = "0.8.0-dev", path = "../../../primitives/consensus/aura" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } -sp-finality-grandpa = { version = "2.0.0-dev", path = "../../../primitives/finality-grandpa" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-dev"} +sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } +sc-service = { version = "0.8.0-rc1", path = "../../../client/service" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } +sc-network = { version = "0.8.0-rc1", path = "../../../client/network" } +sc-consensus-aura = { version = "0.8.0-rc1", path = "../../../client/consensus/aura" } +sp-consensus-aura = { version = "0.8.0-rc1", path = "../../../primitives/consensus/aura" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } +sc-finality-grandpa = { version = "0.8.0-rc1", path = "../../../client/finality-grandpa" } +sp-finality-grandpa = { version = "2.0.0-rc1", path = "../../../primitives/finality-grandpa" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-rc1"} -node-template-runtime = { version = "2.0.0-dev", path = "../runtime" } +node-template-runtime = { version = "2.0.0-rc1", path = "../runtime" } [build-dependencies] -substrate-build-script-utils = { version = "2.0.0-dev", path = "../../../utils/build-script-utils" } +substrate-build-script-utils = { version = "2.0.0-rc1", path = "../../../utils/build-script-utils" } diff --git a/bin/node-template/pallets/template/Cargo.toml b/bin/node-template/pallets/template/Cargo.toml index 01484c608c..1bfd6fe5b2 100644 --- a/bin/node-template/pallets/template/Cargo.toml +++ b/bin/node-template/pallets/template/Cargo.toml @@ -2,7 +2,7 @@ authors = ['Anonymous'] edition = '2018' name = 'pallet-template' -version = "2.0.0-dev" +version = "2.0.0-rc1" license = "Unlicense" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" @@ -16,26 +16,26 @@ codec = { package = "parity-scale-codec", version = "1.3.0", default-features = [dependencies.frame-support] default-features = false -version = "2.0.0-dev" +version = "2.0.0-rc1" path = "../../../../frame/support" [dependencies.frame-system] default-features = false -version = "2.0.0-dev" +version = "2.0.0-rc1" path = "../../../../frame/system" [dev-dependencies.sp-core] default-features = false -version = "2.0.0-dev" +version = "2.0.0-rc1" path = "../../../../primitives/core" [dev-dependencies.sp-io] default-features = false -version = "2.0.0-dev" +version = "2.0.0-rc1" path = "../../../../primitives/io" [dev-dependencies.sp-runtime] default-features = false -version = "2.0.0-dev" +version = "2.0.0-rc1" path = "../../../../primitives/runtime" diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index dfd517130b..fcec09ccea 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Anonymous"] edition = "2018" license = "Unlicense" @@ -13,31 +13,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -aura = { version = "2.0.0-dev", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } -balances = { version = "2.0.0-dev", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } -grandpa = { version = "2.0.0-dev", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } -randomness-collective-flip = { version = "2.0.0-dev", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } -sudo = { version = "2.0.0-dev", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } -system = { version = "2.0.0-dev", default-features = false, package = "frame-system", path = "../../../frame/system" } -timestamp = { version = "2.0.0-dev", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } -transaction-payment = { version = "2.0.0-dev", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } -frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../../frame/executive" } +aura = { version = "2.0.0-rc1", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } +balances = { version = "2.0.0-rc1", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/support" } +grandpa = { version = "2.0.0-rc1", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } +randomness-collective-flip = { version = "2.0.0-rc1", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } +sudo = { version = "2.0.0-rc1", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } +system = { version = "2.0.0-rc1", default-features = false, package = "frame-system", path = "../../../frame/system" } +timestamp = { version = "2.0.0-rc1", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } +transaction-payment = { version = "2.0.0-rc1", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } +frame-executive = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/executive" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/api" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-dev"} -sp-consensus-aura = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/consensus/aura" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-dev"} -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/io" } -sp-offchain = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/offchain" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/session" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/version" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/api" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-rc1"} +sp-consensus-aura = { version = "0.8.0-rc1", default-features = false, path = "../../../primitives/consensus/aura" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } +sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-rc1"} +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/io" } +sp-offchain = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/offchain" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/session" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +sp-transaction-pool = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/version" } -template = { version = "2.0.0-dev", default-features = false, path = "../pallets/template", package = "pallet-template" } +template = { version = "2.0.0-rc1", default-features = false, path = "../pallets/template", package = "pallet-template" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index 70147db207..53eb5d507a 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-bench" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Substrate node integration benchmarks." edition = "2018" @@ -10,21 +10,21 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] log = "0.4.8" -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-testing = { version = "2.0.0-dev", path = "../testing" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +node-primitives = { version = "2.0.0-rc1", path = "../primitives" } +node-testing = { version = "2.0.0-rc1", path = "../testing" } +node-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api/" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } serde = "1.0.101" serde_json = "1.0.41" structopt = "0.3" derive_more = "0.99.2" kvdb = "0.6" kvdb-rocksdb = "0.8" -sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-trie = { version = "2.0.0-rc1", path = "../../../primitives/trie" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } hash-db = "0.15.2" tempfile = "3.1.0" fs_extra = "1" diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index bd7854b0ba..07a74b5671 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-browser-testing" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Tests for the in-browser light client." edition = "2018" @@ -17,5 +17,5 @@ wasm-bindgen-futures = "0.4.10" wasm-bindgen-test = "0.3.10" futures = "0.3.4" -node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-dev"} -sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-dev"} +node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-rc1"} +sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-rc1"} diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 281bee8dbb..2efb58aeeb 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-cli" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Generic Substrate node implementation in Rust." build = "build.rs" @@ -46,76 +46,76 @@ tracing = "0.1.10" parking_lot = "0.10.0" # primitives -sp-authority-discovery = { version = "2.0.0-dev", path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } -grandpa-primitives = { version = "2.0.0-dev", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/timestamp" } -sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/finality-tracker" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sp-authority-discovery = { version = "2.0.0-rc1", path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } +grandpa-primitives = { version = "2.0.0-rc1", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/timestamp" } +sp-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/finality-tracker" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } # client dependencies -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sc-chain-spec = { version = "2.0.0-dev", path = "../../../client/chain-spec" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../../../client/transaction-pool" } -sc-network = { version = "0.8.0-dev", path = "../../../client/network" } -sc-consensus-babe = { version = "0.8.0-dev", path = "../../../client/consensus/babe" } -grandpa = { version = "0.8.0-dev", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } -sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../../../client/db" } -sc-offchain = { version = "2.0.0-dev", path = "../../../client/offchain" } -sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } -sc-basic-authorship = { version = "0.8.0-dev", path = "../../../client/basic-authorship" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } -sc-tracing = { version = "2.0.0-dev", path = "../../../client/tracing" } -sc-telemetry = { version = "2.0.0-dev", path = "../../../client/telemetry" } -sc-authority-discovery = { version = "0.8.0-dev", path = "../../../client/authority-discovery" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } +sc-chain-spec = { version = "2.0.0-rc1", path = "../../../client/chain-spec" } +sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../../../client/transaction-pool" } +sc-network = { version = "0.8.0-rc1", path = "../../../client/network" } +sc-consensus-babe = { version = "0.8.0-rc1", path = "../../../client/consensus/babe" } +grandpa = { version = "0.8.0-rc1", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } +sc-client-db = { version = "0.8.0-rc1", default-features = false, path = "../../../client/db" } +sc-offchain = { version = "2.0.0-rc1", path = "../../../client/offchain" } +sc-rpc = { version = "2.0.0-rc1", path = "../../../client/rpc" } +sc-basic-authorship = { version = "0.8.0-rc1", path = "../../../client/basic-authorship" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } +sc-tracing = { version = "2.0.0-rc1", path = "../../../client/tracing" } +sc-telemetry = { version = "2.0.0-rc1", path = "../../../client/telemetry" } +sc-authority-discovery = { version = "0.8.0-rc1", path = "../../../client/authority-discovery" } # frame dependencies -pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../frame/timestamp" } -pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } -pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../../frame/im-online" } -pallet-authority-discovery = { version = "2.0.0-dev", path = "../../../frame/authority-discovery" } -pallet-staking = { version = "2.0.0-dev", path = "../../../frame/staking" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-rc1", path = "../../../frame/indices" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/timestamp" } +pallet-contracts = { version = "2.0.0-rc1", path = "../../../frame/contracts" } +frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/support" } +pallet-im-online = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/im-online" } +pallet-authority-discovery = { version = "2.0.0-rc1", path = "../../../frame/authority-discovery" } +pallet-staking = { version = "2.0.0-rc1", path = "../../../frame/staking" } +pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } # node-specific dependencies -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -node-rpc = { version = "2.0.0-dev", path = "../rpc" } -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-executor = { version = "2.0.0-dev", path = "../executor" } +node-runtime = { version = "2.0.0-rc1", path = "../runtime" } +node-rpc = { version = "2.0.0-rc1", path = "../rpc" } +node-primitives = { version = "2.0.0-rc1", path = "../primitives" } +node-executor = { version = "2.0.0-rc1", path = "../executor" } # CLI-specific dependencies -sc-cli = { version = "0.8.0-dev", optional = true, path = "../../../client/cli" } -frame-benchmarking-cli = { version = "2.0.0-dev", optional = true, path = "../../../utils/frame/benchmarking-cli" } -node-inspect = { version = "0.8.0-dev", optional = true, path = "../inspect" } +sc-cli = { version = "0.8.0-rc1", optional = true, path = "../../../client/cli" } +frame-benchmarking-cli = { version = "2.0.0-rc1", optional = true, path = "../../../utils/frame/benchmarking-cli" } +node-inspect = { version = "0.8.0-rc1", optional = true, path = "../inspect" } # WASM-specific dependencies wasm-bindgen = { version = "0.2.57", optional = true } wasm-bindgen-futures = { version = "0.4.7", optional = true } -browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-dev"} +browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-rc1"} [target.'cfg(target_arch="x86_64")'.dependencies] -node-executor = { version = "2.0.0-dev", path = "../executor", features = [ "wasmtime" ] } -sc-cli = { version = "0.8.0-dev", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } +node-executor = { version = "2.0.0-rc1", path = "../executor", features = [ "wasmtime" ] } +sc-cli = { version = "0.8.0-rc1", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } [dev-dependencies] -sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-consensus-babe = { version = "0.8.0-dev", features = ["test-helpers"], path = "../../../client/consensus/babe" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../../../client/consensus/epochs" } -sc-service-test = { version = "2.0.0-dev", path = "../../../client/service/test" } +sc-keystore = { version = "2.0.0-rc1", path = "../../../client/keystore" } +sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } +sc-consensus-babe = { version = "0.8.0-rc1", features = ["test-helpers"], path = "../../../client/consensus/babe" } +sc-consensus-epochs = { version = "0.8.0-rc1", path = "../../../client/consensus/epochs" } +sc-service-test = { version = "2.0.0-rc1", path = "../../../client/service/test" } futures = "0.3.4" tempfile = "3.1.0" assert_cmd = "1.0" @@ -126,12 +126,12 @@ platforms = "0.2.1" [build-dependencies] structopt = { version = "0.3.8", optional = true } -node-inspect = { version = "0.8.0-dev", optional = true, path = "../inspect" } -frame-benchmarking-cli = { version = "2.0.0-dev", optional = true, path = "../../../utils/frame/benchmarking-cli" } -substrate-build-script-utils = { version = "2.0.0-dev", optional = true, path = "../../../utils/build-script-utils" } +node-inspect = { version = "0.8.0-rc1", optional = true, path = "../inspect" } +frame-benchmarking-cli = { version = "2.0.0-rc1", optional = true, path = "../../../utils/frame/benchmarking-cli" } +substrate-build-script-utils = { version = "2.0.0-rc1", optional = true, path = "../../../utils/build-script-utils" } [build-dependencies.sc-cli] -version = "0.8.0-dev" +version = "0.8.0-rc1" package = "sc-cli" path = "../../../client/cli" optional = true diff --git a/bin/node/cli/tests/build_spec_works.rs b/bin/node/cli/tests/build_spec_works.rs index 800a4a8c51..d4f6de3b87 100644 --- a/bin/node/cli/tests/build_spec_works.rs +++ b/bin/node/cli/tests/build_spec_works.rs @@ -25,7 +25,7 @@ fn build_spec_works() { let base_path = tempdir().expect("could not create a temp dir"); let output = Command::new(cargo_bin("substrate")) - .args(&["build-spec", "--dev", "-d"]) + .args(&["build-spec", "--rc1", "-d"]) .arg(base_path.path()) .output() .unwrap(); diff --git a/bin/node/cli/tests/check_block_works.rs b/bin/node/cli/tests/check_block_works.rs index 34078b08cf..744effeef1 100644 --- a/bin/node/cli/tests/check_block_works.rs +++ b/bin/node/cli/tests/check_block_works.rs @@ -31,7 +31,7 @@ fn check_block_works() { common::run_dev_node_for_a_while(base_path.path()); let status = Command::new(cargo_bin("substrate")) - .args(&["check-block", "--dev", "--pruning", "archive", "-d"]) + .args(&["check-block", "--rc1", "--pruning", "archive", "-d"]) .arg(base_path.path()) .arg("1") .status() diff --git a/bin/node/cli/tests/common.rs b/bin/node/cli/tests/common.rs index 61a07dd1ca..6f2714988f 100644 --- a/bin/node/cli/tests/common.rs +++ b/bin/node/cli/tests/common.rs @@ -51,7 +51,7 @@ pub fn run_dev_node_for_a_while(base_path: &Path) { let mut cmd = Command::new(cargo_bin("substrate")); let mut cmd = cmd - .args(&["--dev"]) + .args(&["--rc1"]) .arg("-d") .arg(base_path) .spawn() diff --git a/bin/node/cli/tests/export_import_flow.rs b/bin/node/cli/tests/export_import_flow.rs index 85a49b005a..a37dc6e88a 100644 --- a/bin/node/cli/tests/export_import_flow.rs +++ b/bin/node/cli/tests/export_import_flow.rs @@ -82,8 +82,8 @@ impl<'a> ExportImportRevertExecutor<'a> { let sub_command_str = sub_command.to_string(); // Adding "--binary" if need be. let arguments: Vec<&str> = match format_opt { - FormatOpt::Binary => vec![&sub_command_str, "--dev", "--pruning", "archive", "--binary", "-d"], - FormatOpt::Json => vec![&sub_command_str, "--dev", "--pruning", "archive", "-d"], + FormatOpt::Binary => vec![&sub_command_str, "--rc1", "--pruning", "archive", "--binary", "-d"], + FormatOpt::Json => vec![&sub_command_str, "--rc1", "--pruning", "archive", "-d"], }; let tmp: TempDir; @@ -166,7 +166,7 @@ impl<'a> ExportImportRevertExecutor<'a> { /// Runs the `revert` command. fn run_revert(&self) { let output = Command::new(cargo_bin("substrate")) - .args(&["revert", "--dev", "--pruning", "archive", "-d"]) + .args(&["revert", "--rc1", "--pruning", "archive", "-d"]) .arg(&self.base_path.path()) .output() .unwrap(); diff --git a/bin/node/cli/tests/inspect_works.rs b/bin/node/cli/tests/inspect_works.rs index aa9653acad..fd23bb6399 100644 --- a/bin/node/cli/tests/inspect_works.rs +++ b/bin/node/cli/tests/inspect_works.rs @@ -31,7 +31,7 @@ fn inspect_works() { common::run_dev_node_for_a_while(base_path.path()); let status = Command::new(cargo_bin("substrate")) - .args(&["inspect", "--dev", "--pruning", "archive", "-d"]) + .args(&["inspect", "--rc1", "--pruning", "archive", "-d"]) .arg(base_path.path()) .args(&["block", "1"]) .status() diff --git a/bin/node/cli/tests/purge_chain_works.rs b/bin/node/cli/tests/purge_chain_works.rs index 001bed8b13..67a4649a6f 100644 --- a/bin/node/cli/tests/purge_chain_works.rs +++ b/bin/node/cli/tests/purge_chain_works.rs @@ -30,7 +30,7 @@ fn purge_chain_works() { common::run_dev_node_for_a_while(base_path.path()); let status = Command::new(cargo_bin("substrate")) - .args(&["purge-chain", "--dev", "-d"]) + .args(&["purge-chain", "--rc1", "-d"]) .arg(base_path.path()) .arg("-y") .status() diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs index bd79dcd77a..efd9f14762 100644 --- a/bin/node/cli/tests/running_the_node_and_interrupt.rs +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -31,7 +31,7 @@ fn running_the_node_works_and_can_be_interrupted() { fn run_command_and_kill(signal: Signal) { let base_path = tempdir().expect("could not create a temp dir"); let mut cmd = Command::new(cargo_bin("substrate")) - .args(&["--dev", "-d"]) + .args(&["--rc1", "-d"]) .arg(base_path.path()) .spawn() .unwrap(); diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 014ac9a4c8..101a080668 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-executor" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" @@ -13,34 +13,34 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } +node-primitives = { version = "2.0.0-rc1", path = "../primitives" } +node-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +sp-trie = { version = "2.0.0-rc1", path = "../../../primitives/trie" } trie-root = "0.16.0" -frame-benchmarking = { version = "2.0.0-dev", path = "../../../frame/benchmarking" } +frame-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/benchmarking" } [dev-dependencies] criterion = "0.3.0" -frame-support = { version = "2.0.0-dev", path = "../../../frame/support" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -node-testing = { version = "2.0.0-dev", path = "../testing" } -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-dev", path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } -pallet-session = { version = "2.0.0-dev", path = "../../../frame/session" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-dev", path = "../../../frame/treasury" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } -substrate-test-client = { version = "2.0.0-dev", path = "../../../test-utils/client" } +frame-support = { version = "2.0.0-rc1", path = "../../../frame/support" } +frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } +node-testing = { version = "2.0.0-rc1", path = "../testing" } +pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } +pallet-contracts = { version = "2.0.0-rc1", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-rc1", path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-rc1", path = "../../../frame/indices" } +pallet-session = { version = "2.0.0-rc1", path = "../../../frame/session" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-rc1", path = "../../../frame/treasury" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-externalities = { version = "0.8.0-rc1", path = "../../../primitives/externalities" } +substrate-test-client = { version = "2.0.0-rc1", path = "../../../test-utils/client" } wabt = "0.9.2" [features] diff --git a/bin/node/inspect/Cargo.toml b/bin/node/inspect/Cargo.toml index 5beb1f948e..7f75bd2ca3 100644 --- a/bin/node/inspect/Cargo.toml +++ b/bin/node/inspect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-inspect" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,10 +14,10 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0" } derive_more = "0.99" log = "0.4.8" -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } structopt = "0.3.8" diff --git a/bin/node/primitives/Cargo.toml b/bin/node/primitives/Cargo.toml index 5850db83d4..ff45a3d81d 100644 --- a/bin/node/primitives/Cargo.toml +++ b/bin/node/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-primitives" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,13 +12,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/application-crypto" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } [dev-dependencies] -sp-serializer = { version = "2.0.0-dev", path = "../../../primitives/serializer" } +sp-serializer = { version = "2.0.0-rc1", path = "../../../primitives/serializer" } pretty_assertions = "0.6.1" [features] diff --git a/bin/node/rpc-client/Cargo.toml b/bin/node/rpc-client/Cargo.toml index 8ba5aed4aa..c81a5a5ba9 100644 --- a/bin/node/rpc-client/Cargo.toml +++ b/bin/node/rpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc-client" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,5 +16,5 @@ futures = "0.1.29" hyper = "0.12.35" jsonrpc-core-client = { version = "14.0.5", default-features = false, features = ["http"] } log = "0.4.8" -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } +node-primitives = { version = "2.0.0-rc1", path = "../primitives" } +sc-rpc = { version = "2.0.0-rc1", path = "../../../client/rpc" } diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index 5eb0d271b9..f5dbf72ea1 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -11,23 +11,23 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } jsonrpc-core = "14.0.3" -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -pallet-contracts-rpc = { version = "0.8.0-dev", path = "../../../frame/contracts/rpc/" } -pallet-transaction-payment-rpc = { version = "2.0.0-dev", path = "../../../frame/transaction-payment/rpc/" } -substrate-frame-rpc-system = { version = "2.0.0-dev", path = "../../../utils/frame/rpc/system" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -sc-consensus-babe = { version = "0.8.0-dev", path = "../../../client/consensus/babe" } -sc-consensus-babe-rpc = { version = "0.8.0-dev", path = "../../../client/consensus/babe/rpc" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } -sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../../../client/consensus/epochs" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sc-finality-grandpa = { version = "0.8.0-dev", path = "../../../client/finality-grandpa" } -sc-finality-grandpa-rpc = { version = "0.8.0-dev", path = "../../../client/finality-grandpa/rpc" } -sc-rpc-api = { version = "0.8.0-dev", path = "../../../client/rpc-api" } +node-primitives = { version = "2.0.0-rc1", path = "../primitives" } +node-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +pallet-contracts-rpc = { version = "0.8.0-rc1", path = "../../../frame/contracts/rpc/" } +pallet-transaction-payment-rpc = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment/rpc/" } +substrate-frame-rpc-system = { version = "2.0.0-rc1", path = "../../../utils/frame/rpc/system" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } +sc-consensus-babe = { version = "0.8.0-rc1", path = "../../../client/consensus/babe" } +sc-consensus-babe-rpc = { version = "0.8.0-rc1", path = "../../../client/consensus/babe/rpc" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } +sc-keystore = { version = "2.0.0-rc1", path = "../../../client/keystore" } +sc-consensus-epochs = { version = "0.8.0-rc1", path = "../../../client/consensus/epochs" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sc-finality-grandpa = { version = "0.8.0-rc1", path = "../../../client/finality-grandpa" } +sc-finality-grandpa-rpc = { version = "0.8.0-rc1", path = "../../../client/finality-grandpa/rpc" } +sc-rpc-api = { version = "0.8.0-rc1", path = "../../../client/rpc-api" } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index 8ca89367fe..b3591f12bc 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -20,68 +20,68 @@ serde = { version = "1.0.102", optional = true } static_assertions = "1.1.0" # primitives -sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/consensus/babe" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-dev"} -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } -node-primitives = { version = "2.0.0-dev", default-features = false, path = "../primitives" } -sp-offchain = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/offchain" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } -sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../../primitives/keyring" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/session" } -sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/version" } +sp-authority-discovery = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-rc1", default-features = false, path = "../../../primitives/consensus/babe" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-rc1"} +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/inherents" } +node-primitives = { version = "2.0.0-rc1", default-features = false, path = "../primitives" } +sp-offchain = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/offchain" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/staking" } +sp-keyring = { version = "2.0.0-rc1", optional = true, path = "../../../primitives/keyring" } +sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/session" } +sp-transaction-pool = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/version" } # frame dependencies -frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../../frame/executive" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../frame/support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system" } -frame-system-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system/benchmarking", optional = true } -frame-system-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } -pallet-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../../frame/authority-discovery" } -pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../../../frame/authorship" } -pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../../frame/babe" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../../../frame/balances" } -pallet-collective = { version = "2.0.0-dev", default-features = false, path = "../../../frame/collective" } -pallet-contracts = { version = "2.0.0-dev", default-features = false, path = "../../../frame/contracts" } -pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "../../../frame/contracts/common/" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-dev", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } -pallet-democracy = { version = "2.0.0-dev", default-features = false, path = "../../../frame/democracy" } -pallet-elections-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../../frame/elections-phragmen" } -pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../frame/finality-tracker" } -pallet-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-dev", default-features = false, path = "../../../frame/indices" } -pallet-identity = { version = "2.0.0-dev", default-features = false, path = "../../../frame/identity" } -pallet-membership = { version = "2.0.0-dev", default-features = false, path = "../../../frame/membership" } -pallet-offences = { version = "2.0.0-dev", default-features = false, path = "../../../frame/offences" } -pallet-offences-benchmarking = { version = "2.0.0-dev", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } -pallet-randomness-collective-flip = { version = "2.0.0-dev", default-features = false, path = "../../../frame/randomness-collective-flip" } -pallet-recovery = { version = "2.0.0-dev", default-features = false, path = "../../../frame/recovery" } -pallet-session = { version = "2.0.0-dev", features = ["historical"], path = "../../../frame/session", default-features = false } -pallet-session-benchmarking = { version = "2.0.0-dev", path = "../../../frame/session/benchmarking", default-features = false, optional = true } -pallet-staking = { version = "2.0.0-dev", default-features = false, path = "../../../frame/staking" } -pallet-staking-reward-curve = { version = "2.0.0-dev", default-features = false, path = "../../../frame/staking/reward-curve" } -pallet-scheduler = { version = "2.0.0-dev", default-features = false, path = "../../../frame/scheduler" } -pallet-society = { version = "2.0.0-dev", default-features = false, path = "../../../frame/society" } -pallet-sudo = { version = "2.0.0-dev", default-features = false, path = "../../../frame/sudo" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../frame/timestamp" } -pallet-treasury = { version = "2.0.0-dev", default-features = false, path = "../../../frame/treasury" } -pallet-utility = { version = "2.0.0-dev", default-features = false, path = "../../../frame/utility" } -pallet-transaction-payment = { version = "2.0.0-dev", default-features = false, path = "../../../frame/transaction-payment" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } -pallet-vesting = { version = "2.0.0-dev", default-features = false, path = "../../../frame/vesting" } +frame-executive = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/executive" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/benchmarking", optional = true } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system" } +frame-system-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system/benchmarking", optional = true } +frame-system-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } +pallet-authority-discovery = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/authority-discovery" } +pallet-authorship = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/authorship" } +pallet-babe = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/babe" } +pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/balances" } +pallet-collective = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/collective" } +pallet-contracts = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/contracts" } +pallet-contracts-primitives = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/contracts/common/" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-rc1", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } +pallet-democracy = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/democracy" } +pallet-elections-phragmen = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/elections-phragmen" } +pallet-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/finality-tracker" } +pallet-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/indices" } +pallet-identity = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/identity" } +pallet-membership = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/membership" } +pallet-offences = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/offences" } +pallet-offences-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } +pallet-randomness-collective-flip = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/randomness-collective-flip" } +pallet-recovery = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/recovery" } +pallet-session = { version = "2.0.0-rc1", features = ["historical"], path = "../../../frame/session", default-features = false } +pallet-session-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/session/benchmarking", default-features = false, optional = true } +pallet-staking = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/staking" } +pallet-staking-reward-curve = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/staking/reward-curve" } +pallet-scheduler = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/scheduler" } +pallet-society = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/society" } +pallet-sudo = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/sudo" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/timestamp" } +pallet-treasury = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/treasury" } +pallet-utility = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/utility" } +pallet-transaction-payment = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/transaction-payment" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } +pallet-vesting = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/vesting" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index dded81ac8e..1feb707125 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-testing" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Test utilities for Substrate node." edition = "2018" @@ -13,40 +13,40 @@ publish = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -sc-service = { version = "0.8.0-dev", features = ["test-helpers", "db"], path = "../../../client/service" } -sc-client-db = { version = "0.8.0-dev", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api/" } +pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } +sc-service = { version = "0.8.0-rc1", features = ["test-helpers", "db"], path = "../../../client/service" } +sc-client-db = { version = "0.8.0-rc1", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api/" } codec = { package = "parity-scale-codec", version = "1.3.0" } -pallet-contracts = { version = "2.0.0-dev", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } -pallet-indices = { version = "2.0.0-dev", path = "../../../frame/indices" } -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -node-executor = { version = "2.0.0-dev", path = "../executor" } -node-primitives = { version = "2.0.0-dev", path = "../primitives" } -node-runtime = { version = "2.0.0-dev", path = "../runtime" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -frame-support = { version = "2.0.0-dev", path = "../../../frame/support" } -pallet-session = { version = "2.0.0-dev", path = "../../../frame/session" } -pallet-society = { version = "2.0.0-dev", path = "../../../frame/society" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -pallet-staking = { version = "2.0.0-dev", path = "../../../frame/staking" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor", features = ["wasmtime"] } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -substrate-test-client = { version = "2.0.0-dev", path = "../../../test-utils/client" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-dev", path = "../../../frame/treasury" } +pallet-contracts = { version = "2.0.0-rc1", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-rc1", path = "../../../frame/indices" } +sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } +node-executor = { version = "2.0.0-rc1", path = "../executor" } +node-primitives = { version = "2.0.0-rc1", path = "../primitives" } +node-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +frame-support = { version = "2.0.0-rc1", path = "../../../frame/support" } +pallet-session = { version = "2.0.0-rc1", path = "../../../frame/session" } +pallet-society = { version = "2.0.0-rc1", path = "../../../frame/society" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-rc1", path = "../../../frame/staking" } +sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor", features = ["wasmtime"] } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } +substrate-test-client = { version = "2.0.0-rc1", path = "../../../test-utils/client" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-rc1", path = "../../../frame/treasury" } wabt = "0.9.2" -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/finality-tracker" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/timestamp" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sp-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/finality-tracker" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/timestamp" } +sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } log = "0.4.8" tempfile = "3.1.0" fs_extra = "1" @@ -54,4 +54,4 @@ futures = "0.3.1" [dev-dependencies] criterion = "0.3.0" -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } +sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index 211460400c..919a500718 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chain-spec-builder" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,9 +13,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" -sc-keystore = { version = "2.0.0-dev", path = "../../../client/keystore" } -sc-chain-spec = { version = "2.0.0-dev", path = "../../../client/chain-spec" } -node-cli = { version = "2.0.0-dev", path = "../../node/cli" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sc-keystore = { version = "2.0.0-rc1", path = "../../../client/keystore" } +sc-chain-spec = { version = "2.0.0-rc1", path = "../../../client/chain-spec" } +node-cli = { version = "2.0.0-rc1", path = "../../node/cli" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } rand = "0.7.2" structopt = "0.3.8" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 950e77a8e1..43076062d3 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "subkey" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,10 +12,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.1.29" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -node-runtime = { version = "2.0.0-dev", path = "../../node/runtime" } -node-primitives = { version = "2.0.0-dev", path = "../../node/primitives" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +node-runtime = { version = "2.0.0-rc1", path = "../../node/runtime" } +node-primitives = { version = "2.0.0-rc1", path = "../../node/primitives" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } rand = "0.7.2" clap = "2.33.0" tiny-bip39 = "0.7" @@ -23,14 +23,14 @@ substrate-bip39 = "0.4.1" hex = "0.4.0" hex-literal = "0.2.1" codec = { package = "parity-scale-codec", version = "1.3.0" } -frame-system = { version = "2.0.0-dev", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-dev", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../../../frame/transaction-payment" } -pallet-grandpa = { version = "2.0.0-dev", path = "../../../frame/grandpa" } +frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } +pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } rpassword = "4.0.1" itertools = "0.8.2" derive_more = { version = "0.99.2" } -sc-rpc = { version = "2.0.0-dev", path = "../../../client/rpc" } +sc-rpc = { version = "2.0.0-rc1", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" libp2p = "0.19.1" diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 9e983eb966..8afe365363 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,36 +14,36 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } derive_more = { version = "0.99.2" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } +sc-executor = { version = "0.8.0-rc1", path = "../executor" } +sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } fnv = { version = "1.0.6" } futures = { version = "0.3.1" } hash-db = { version = "0.15.2", default-features = false } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } kvdb = "0.6.0" log = { version = "0.4.8" } parking_lot = "0.10.0" lazy_static = "1.4.0" -sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } +sp-database = { version = "2.0.0-rc1", path = "../../primitives/database" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/version" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } +sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc1", path = "../../utils/prometheus" } [dev-dependencies] kvdb-memorydb = "0.6.0" -sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } +sp-test-primitives = { version = "2.0.0-rc1", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../test-utils/runtime" } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 92cf15051e..3a40adf7c6 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-authority-discovery" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -23,21 +23,21 @@ futures = "0.3.4" futures-timer = "3.0.1" libp2p = { version = "0.19.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} prost = "0.6.1" rand = "0.7.2" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } -sc-network = { version = "0.8.0-dev", path = "../network" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } +sc-network = { version = "0.8.0-rc1", path = "../network" } serde_json = "1.0.41" -sp-authority-discovery = { version = "2.0.0-dev", path = "../../primitives/authority-discovery" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-authority-discovery = { version = "2.0.0-rc1", path = "../../primitives/authority-discovery" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } [dev-dependencies] env_logger = "0.7.0" quickcheck = "0.9.0" -sc-peerset = { version = "2.0.0-dev", path = "../peerset" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client"} +sc-peerset = { version = "2.0.0-rc1", path = "../peerset" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client"} diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index 6beb7b7f34..a452f08524 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-basic-authorship" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,21 +16,21 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-dev", path = "../../primitives/inherents" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } -sc-proposer-metrics = { version = "0.8.0-dev", path = "../proposer-metrics" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-rc1", path = "../../primitives/inherents" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } +sc-proposer-metrics = { version = "0.8.0-rc1", path = "../proposer-metrics" } tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } [dev-dependencies] -sc-transaction-pool = { version = "2.0.0-dev", path = "../../client/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../../client/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } parking_lot = "0.10.0" diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index df2aca9cf5..0be48deb49 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-block-builder" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-block-builder = { version = "2.0.0-dev", path = "../../primitives/block-builder" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-block-builder = { version = "2.0.0-rc1", path = "../../primitives/block-builder" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } [dev-dependencies] substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } +sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } diff --git a/client/chain-spec/Cargo.toml b/client/chain-spec/Cargo.toml index fbbf05f55b..aa32d97b25 100644 --- a/client/chain-spec/Cargo.toml +++ b/client/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,12 +12,12 @@ description = "Substrate chain configurations." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-chain-spec-derive = { version = "2.0.0-dev", path = "./derive" } +sc-chain-spec-derive = { version = "2.0.0-rc1", path = "./derive" } impl-trait-for-tuples = "0.1.3" -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-chain-spec = { version = "2.0.0-dev", path = "../../primitives/chain-spec" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-chain-spec = { version = "2.0.0-rc1", path = "../../primitives/chain-spec" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } diff --git a/client/chain-spec/derive/Cargo.toml b/client/chain-spec/derive/Cargo.toml index 643b3bab82..4bda059264 100644 --- a/client/chain-spec/derive/Cargo.toml +++ b/client/chain-spec/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec-derive" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index de67879295..dd751612df 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-cli" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" @@ -25,23 +25,23 @@ tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.4" fdlimit = "0.1.4" serde_json = "1.0.41" -sc-informant = { version = "0.8.0-dev", path = "../informant" } -sp-panic-handler = { version = "2.0.0-dev", path = "../../primitives/panic-handler" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../service" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-dev"} -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sc-informant = { version = "0.8.0-rc1", path = "../informant" } +sp-panic-handler = { version = "2.0.0-rc1", path = "../../primitives/panic-handler" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../service" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-rc1"} +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } names = "0.11.0" structopt = "0.3.8" -sc-tracing = { version = "2.0.0-dev", path = "../tracing" } +sc-tracing = { version = "2.0.0-rc1", path = "../tracing" } chrono = "0.4.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index c8a00f9185..b9be82bd63 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" @@ -12,37 +12,37 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-dev", path = "../../../primitives/consensus/aura" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-rc1", path = "../../../primitives/consensus/aura" } +sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } derive_more = "0.99.2" futures = "0.3.4" futures-timer = "3.0.1" -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sc-keystore = { version = "2.0.0-dev", path = "../../keystore" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sc-keystore = { version = "2.0.0-rc1", path = "../../keystore" } log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-version = { version = "2.0.0-dev", path = "../../../primitives/version" } -sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-version = { version = "2.0.0-rc1", path = "../../../primitives/version" } +sc-consensus-slots = { version = "0.8.0-rc1", path = "../slots" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-rc1", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-rc1", path = "../../telemetry" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} [dev-dependencies] -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-dev", path = "../../executor" } -sc-network = { version = "0.8.0-dev", path = "../../network" } -sc-network-test = { version = "0.8.0-dev", path = "../../network/test" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-rc1", path = "../../executor" } +sc-network = { version = "0.8.0-rc1", path = "../../network" } +sc-network-test = { version = "0.8.0-rc1", path = "../../network/test" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 1a0c7b2985..154d1509d2 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" @@ -14,31 +14,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } num-bigint = "0.2.3" num-rational = "0.2.2" num-traits = "0.2.8" serde = { version = "1.0.104", features = ["derive"] } -sp-version = { version = "2.0.0-dev", path = "../../../primitives/version" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } -sc-keystore = { version = "2.0.0-dev", path = "../../keystore" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../epochs" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-consensus-vrf = { version = "0.8.0-dev", path = "../../../primitives/consensus/vrf" } -sc-consensus-uncles = { version = "0.8.0-dev", path = "../uncles" } -sc-consensus-slots = { version = "0.8.0-dev", path = "../slots" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +sp-version = { version = "2.0.0-rc1", path = "../../../primitives/version" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sp-timestamp = { version = "2.0.0-rc1", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-rc1", path = "../../telemetry" } +sc-keystore = { version = "2.0.0-rc1", path = "../../keystore" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sc-consensus-epochs = { version = "0.8.0-rc1", path = "../epochs" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-consensus-vrf = { version = "0.8.0-rc1", path = "../../../primitives/consensus/vrf" } +sc-consensus-uncles = { version = "0.8.0-rc1", path = "../uncles" } +sc-consensus-slots = { version = "0.8.0-rc1", path = "../slots" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +fork-tree = { version = "2.0.0-rc1", path = "../../../utils/fork-tree" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" @@ -50,13 +50,13 @@ pdqselect = "0.1.0" derive_more = "0.99.2" [dev-dependencies] -sp-keyring = { version = "2.0.0-dev", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-dev", path = "../../executor" } -sc-network = { version = "0.8.0-dev", path = "../../network" } -sc-network-test = { version = "0.8.0-dev", path = "../../network/test" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } +sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-rc1", path = "../../executor" } +sc-network = { version = "0.8.0-rc1", path = "../../network" } +sc-network-test = { version = "0.8.0-rc1", path = "../../network/test" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../block-builder" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/rpc/Cargo.toml b/client/consensus/babe/rpc/Cargo.toml index 900e29bfba..22c95b6cd1 100644 --- a/client/consensus/babe/rpc/Cargo.toml +++ b/client/consensus/babe/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe-rpc" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "RPC extensions for the BABE consensus algorithm" edition = "2018" @@ -12,27 +12,27 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-consensus-babe = { version = "0.8.0-dev", path = "../" } -sc-rpc-api = { version = "0.8.0-dev", path = "../../../rpc-api" } +sc-consensus-babe = { version = "0.8.0-rc1", path = "../" } +sc-rpc-api = { version = "0.8.0-rc1", path = "../../../rpc-api" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../../primitives/consensus/babe" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../../primitives/consensus/babe" } serde = { version = "1.0.104", features=["derive"] } -sp-blockchain = { version = "2.0.0-dev", path = "../../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../../primitives/runtime" } -sc-consensus-epochs = { version = "0.8.0-dev", path = "../../epochs" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../../primitives/runtime" } +sc-consensus-epochs = { version = "0.8.0-rc1", path = "../../epochs" } futures = { version = "0.3.4", features = ["compat"] } derive_more = "0.99.2" -sp-api = { version = "2.0.0-dev", path = "../../../../primitives/api" } -sp-consensus = { version = "0.8.0-dev", path = "../../../../primitives/consensus/common" } -sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } -sc-keystore = { version = "2.0.0-dev", path = "../../../keystore" } +sp-api = { version = "2.0.0-rc1", path = "../../../../primitives/api" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-rc1", path = "../../../../primitives/core" } +sc-keystore = { version = "2.0.0-rc1", path = "../../../keystore" } [dev-dependencies] -sc-consensus = { version = "0.8.0-dev", path = "../../../consensus/common" } +sc-consensus = { version = "0.8.0-rc1", path = "../../../consensus/common" } serde_json = "1.0.50" -sp-application-crypto = { version = "2.0.0-dev", path = "../../../../primitives/application-crypto" } -sp-keyring = { version = "2.0.0-dev", path = "../../../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../../../primitives/application-crypto" } +sp-keyring = { version = "2.0.0-rc1", path = "../../../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../../test-utils/runtime/client" } tempfile = "3.1.0" diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index bf7fac9568..c4743c2175 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,7 +12,7 @@ description = "Collection of common consensus specific imlementations for Substr targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } diff --git a/client/consensus/epochs/Cargo.toml b/client/consensus/epochs/Cargo.toml index 7c2edffc53..04397da31d 100644 --- a/client/consensus/epochs/Cargo.toml +++ b/client/consensus/epochs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-epochs" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Generic epochs-based utilities for consensus" edition = "2018" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -fork-tree = { version = "2.0.0-dev", path = "../../../utils/fork-tree" } -sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-dev"} -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sc-client-api = { path = "../../api" , version = "2.0.0-dev"} +fork-tree = { version = "2.0.0-rc1", path = "../../../utils/fork-tree" } +sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-rc1"} +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sc-client-api = { path = "../../api" , version = "2.0.0-rc1"} diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 3d42412f2f..84050547a5 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-manual-seal" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Manual sealing engine for Substrate" edition = "2018" @@ -22,20 +22,20 @@ parking_lot = "0.10.0" serde = { version = "1.0", features=["derive"] } assert_matches = "1.3.0" -sc-client-api = { path = "../../../client/api", version = "2.0.0-dev" } -sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-dev" } -sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-dev" } -sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-dev" } -sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-dev" } -sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-dev" } -sp-core = { path = "../../../primitives/core", version = "2.0.0-dev" } -sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-dev" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev" } +sc-client-api = { path = "../../../client/api", version = "2.0.0-rc1" } +sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-rc1" } +sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-rc1" } +sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-rc1" } +sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-rc1" } +sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-rc1" } +sp-core = { path = "../../../primitives/core", version = "2.0.0-rc1" } +sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-rc1" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1" } [dev-dependencies] -sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-dev" } -substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-dev" } -substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-dev" } +sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-rc1" } +substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-rc1" } +substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-rc1" } tokio = { version = "0.2", features = ["rt-core", "macros"] } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index 3d47a983ea..252bd04990 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "PoW consensus algorithm for substrate" edition = "2018" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-block-builder = { version = "2.0.0-dev", path = "../../../primitives/block-builder" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } -sp-consensus-pow = { version = "0.8.0-dev", path = "../../../primitives/consensus/pow" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sp-consensus-pow = { version = "0.8.0-rc1", path = "../../../primitives/consensus/pow" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } log = "0.4.8" futures = { version = "0.3.1", features = ["compat"] } -sp-timestamp = { version = "2.0.0-dev", path = "../../../primitives/timestamp" } +sp-timestamp = { version = "2.0.0-rc1", path = "../../../primitives/timestamp" } derive_more = "0.99.2" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index f778cbf2f0..25c6917138 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-slots" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../../primitives/application-crypto" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sc-telemetry = { version = "2.0.0-dev", path = "../../telemetry" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sc-telemetry = { version = "2.0.0-rc1", path = "../../telemetry" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" log = "0.4.8" [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } diff --git a/client/consensus/uncles/Cargo.toml b/client/consensus/uncles/Cargo.toml index b9039d8189..cc97f18386 100644 --- a/client/consensus/uncles/Cargo.toml +++ b/client/consensus/uncles/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-uncles" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Generic uncle inclusion utilities for consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-authorship = { version = "2.0.0-dev", path = "../../../primitives/authorship" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-dev", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-authorship = { version = "2.0.0-rc1", path = "../../../primitives/authorship" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } log = "0.4.8" diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index c9006ee2f6..a33fe69643 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-db" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -23,22 +23,22 @@ parity-util-mem = { version = "0.6.1", default-features = false, features = ["st codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } blake2-rfc = "0.2.18" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sc-state-db = { version = "0.8.0-dev", path = "../state-db" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sc-executor = { version = "0.8.0-rc1", path = "../executor" } +sc-state-db = { version = "0.8.0-rc1", path = "../state-db" } +sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-database = { version = "2.0.0-rc1", path = "../../primitives/database" } parity-db = { version = "0.1.2", optional = true } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc1", path = "../../utils/prometheus" } [dev-dependencies] -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } env_logger = "0.7.0" quickcheck = "0.9" kvdb-rocksdb = "0.8" diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index ac863fbd8c..2fbc1714c8 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,22 +15,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-serializer = { version = "2.0.0-dev", path = "../../primitives/serializer" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-panic-handler = { version = "2.0.0-dev", path = "../../primitives/panic-handler" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } +sp-serializer = { version = "2.0.0-rc1", path = "../../primitives/serializer" } +sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } +sp-panic-handler = { version = "2.0.0-rc1", path = "../../primitives/panic-handler" } wasmi = "0.6.2" parity-wasm = "0.41.0" lazy_static = "1.4.0" -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface" } -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } -sc-executor-common = { version = "0.8.0-dev", path = "common" } -sc-executor-wasmi = { version = "0.8.0-dev", path = "wasmi" } -sc-executor-wasmtime = { version = "0.8.0-dev", path = "wasmtime", optional = true } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc1", path = "../../primitives/runtime-interface" } +sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } +sc-executor-common = { version = "0.8.0-rc1", path = "common" } +sc-executor-wasmi = { version = "0.8.0-rc1", path = "wasmi" } +sc-executor-wasmtime = { version = "0.8.0-rc1", path = "wasmtime", optional = true } parking_lot = "0.10.0" log = "0.4.8" libsecp256k1 = "0.3.4" @@ -39,11 +39,11 @@ libsecp256k1 = "0.3.4" assert_matches = "1.3.0" wabt = "0.9.2" hex-literal = "0.2.1" -sc-runtime-test = { version = "2.0.0-dev", path = "runtime-test" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-runtime-test = { version = "2.0.0-rc1", path = "runtime-test" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../test-utils/runtime" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } test-case = "0.3.3" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } [features] default = [ "std" ] diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index ed91c353b9..df9141d80c 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-common" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,11 +18,11 @@ derive_more = "0.99.2" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } wasmi = "0.6.2" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } -sp-serializer = { version = "2.0.0-dev", path = "../../../primitives/serializer" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-rc1", path = "../../../primitives/allocator" } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc1", path = "../../../primitives/runtime-interface" } +sp-serializer = { version = "2.0.0-rc1", path = "../../../primitives/serializer" } [features] default = [] diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index c675e72e0f..6ad0338b59 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-runtime-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,12 +13,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/io" } -sp-sandbox = { version = "0.8.0-dev", default-features = false, path = "../../../primitives/sandbox" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-allocator = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/allocator" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/io" } +sp-sandbox = { version = "0.8.0-rc1", default-features = false, path = "../../../primitives/sandbox" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +sp-allocator = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/allocator" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index 7ccb167325..c170187658 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmi" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4.8" wasmi = "0.6.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-dev", path = "../common" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-rc1", path = "../common" } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc1", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-rc1", path = "../../../primitives/allocator" } diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index e7f19a6c1b..b2b4ee1753 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmtime" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,11 +16,11 @@ log = "0.4.8" scoped-tls = "1.0" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-dev", path = "../common" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-dev", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-rc1", path = "../common" } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc1", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-rc1", path = "../../../primitives/allocator" } wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.4" } wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.4" } wasmtime-environ = "0.16" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index f0f89b6278..40dfe7c319 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -fork-tree = { version = "2.0.0-dev", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-rc1", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" @@ -23,37 +23,37 @@ parking_lot = "0.10.0" rand = "0.7.2" assert_matches = "1.3.0" parity-scale-codec = { version = "1.3.0", features = ["derive"] } -sp-arithmetic = { version = "2.0.0-dev", path = "../../primitives/arithmetic" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-dev", path = "../../client/consensus/common" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sp-arithmetic = { version = "2.0.0-rc1", path = "../../primitives/arithmetic" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-rc1", path = "../../client/consensus/common" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } serde_json = "1.0.41" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-inherents = { version = "2.0.0-dev", path = "../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-network-gossip = { version = "0.8.0-dev", path = "../network-gossip" } -sp-finality-tracker = { version = "2.0.0-dev", path = "../../primitives/finality-tracker" } -sp-finality-grandpa = { version = "2.0.0-dev", path = "../../primitives/finality-grandpa" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-inherents = { version = "2.0.0-rc1", path = "../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sc-network-gossip = { version = "0.8.0-rc1", path = "../network-gossip" } +sp-finality-tracker = { version = "2.0.0-rc1", path = "../../primitives/finality-tracker" } +sp-finality-grandpa = { version = "2.0.0-rc1", path = "../../primitives/finality-grandpa" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} +sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } pin-project = "0.4.6" [dev-dependencies] finality-grandpa = { version = "0.12.3", features = ["derive-codec", "test-helpers"] } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-network-test = { version = "0.8.0-dev", path = "../network/test" } -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../primitives/consensus/babe" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sc-network-test = { version = "0.8.0-rc1", path = "../network/test" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../primitives/consensus/babe" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } env_logger = "0.7.0" tokio = { version = "0.2", features = ["rt-core"] } tempfile = "3.1.0" -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } diff --git a/client/finality-grandpa/rpc/Cargo.toml b/client/finality-grandpa/rpc/Cargo.toml index 0eecec19f7..dbff14bd16 100644 --- a/client/finality-grandpa/rpc/Cargo.toml +++ b/client/finality-grandpa/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa-rpc" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "RPC extensions for the GRANDPA finality gadget" repository = "https://github.com/paritytech/substrate/" @@ -8,7 +8,7 @@ edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] -sc-finality-grandpa = { version = "0.8.0-dev", path = "../" } +sc-finality-grandpa = { version = "0.8.0-rc1", path = "../" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.3" @@ -20,4 +20,4 @@ log = "0.4.8" derive_more = "0.99.2" [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } diff --git a/client/informant/Cargo.toml b/client/informant/Cargo.toml index 5957cfc297..d4b6b96a27 100644 --- a/client/informant/Cargo.toml +++ b/client/informant/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-informant" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Substrate informant." edition = "2018" @@ -17,8 +17,8 @@ futures = "0.3.4" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } wasm-timer = "0.2" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../service" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../service" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index 6de93f28be..1d4312f816 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-keystore" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../primitives/application-crypto" } hex = "0.4.0" rand = "0.7.2" serde_json = "1.0.41" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 3ccdae6b5c..a45f96e8b9 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Gossiping for the Substrate network protocol" name = "sc-network-gossip" -version = "0.8.0-dev" +version = "0.8.0-rc1" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -19,12 +19,12 @@ futures-timer = "3.0.1" libp2p = { version = "0.19.1", default-features = false, features = ["websocket"] } log = "0.4.8" lru = "0.4.3" -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } wasm-timer = "0.2" [dev-dependencies] async-std = "1.5" quickcheck = "0.9.0" rand = "0.7.2" -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index 9c32eeaf7d..daa5df0e15 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate network protocol" name = "sc-network" -version = "0.8.0-dev" +version = "0.8.0-rc1" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -26,7 +26,7 @@ derive_more = "0.99.2" either = "1.5.3" erased-serde = "0.3.9" fnv = "1.0.6" -fork-tree = { version = "2.0.0-dev", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-rc1", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" futures_codec = "0.3.3" @@ -39,23 +39,23 @@ lru = "0.4.0" nohash-hasher = "0.2.0" parking_lot = "0.10.0" pin-project = "0.4.6" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-dev", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc1", path = "../../utils/prometheus" } prost = "0.6.1" rand = "0.7.2" -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-peerset = { version = "2.0.0-dev", path = "../peerset" } +sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sc-peerset = { version = "2.0.0-rc1", path = "../peerset" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } slog_derive = "0.2.0" smallvec = "0.6.10" -sp-arithmetic = { version = "2.0.0-dev", path = "../../primitives/arithmetic" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +sp-arithmetic = { version = "2.0.0-rc1", path = "../../primitives/arithmetic" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } thiserror = "1" unsigned-varint = { version = "0.3.1", features = ["futures", "futures-codec"] } void = "1.0.2" @@ -74,10 +74,10 @@ env_logger = "0.7.0" libp2p = { version = "0.19.1", default-features = false, features = ["secio"] } quickcheck = "0.9.0" rand = "0.7.2" -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -sp-test-primitives = { version = "2.0.0-dev", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +sp-test-primitives = { version = "2.0.0-rc1", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } tempfile = "3.1.0" [features] diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 554a30c111..73a5d729d9 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Integration tests for Substrate network protocol" name = "sc-network-test" -version = "0.8.0-dev" +version = "0.8.0-rc1" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-network = { version = "0.8.0-dev", path = "../" } +sc-network = { version = "0.8.0-rc1", path = "../" } log = "0.4.8" parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" rand = "0.7.2" libp2p = { version = "0.19.1", default-features = false, features = ["libp2p-websocket"] } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../../primitives/consensus/babe" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../block-builder" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } env_logger = "0.7.0" -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../../test-utils/runtime" } tempfile = "3.1.0" -sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-service = { version = "0.8.0-rc1", default-features = false, features = ["test-helpers"], path = "../../service" } diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index 5a13b44a80..93d2ea5603 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers" name = "sc-offchain" -version = "2.0.0-dev" +version = "2.0.0-rc1" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bytes = "0.5" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } fnv = "1.0.6" futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" threadpool = "1.7" num_cpus = "1.10" -sp-offchain = { version = "2.0.0-dev", path = "../../primitives/offchain" } +sp-offchain = { version = "2.0.0-rc1", path = "../../primitives/offchain" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } rand = "0.7.2" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } [target.'cfg(not(target_os = "unknown"))'.dependencies] hyper = "0.13.2" @@ -38,10 +38,10 @@ hyper-rustls = "0.20" [dev-dependencies] env_logger = "0.7.0" fdlimit = "0.1.4" -sc-client-db = { version = "0.8.0-dev", default-features = true, path = "../db/" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sc-client-db = { version = "0.8.0-rc1", default-features = true, path = "../db/" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } tokio = "0.2" [features] diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index 851128e358..668d40cd60 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -3,7 +3,7 @@ description = "Connectivity manager based on reputation" homepage = "http://parity.io" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" name = "sc-peerset" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" repository = "https://github.com/paritytech/substrate/" @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" libp2p = { version = "0.19.1", default-features = false } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils"} +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils"} log = "0.4.8" serde_json = "1.0.41" wasm-timer = "0.2" diff --git a/client/proposer-metrics/Cargo.toml b/client/proposer-metrics/Cargo.toml index 9d510027ec..406f98fa71 100644 --- a/client/proposer-metrics/Cargo.toml +++ b/client/proposer-metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-proposer-metrics" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -13,4 +13,4 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index f591a6d853..e993291bad 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-api" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -21,11 +21,11 @@ jsonrpc-derive = "14.0.3" jsonrpc-pubsub = "14.0.3" log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-dev"} -sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-dev"} +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } +sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-rc1"} +sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-rc1"} serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sp-rpc = { version = "2.0.0-dev", path = "../../primitives/rpc" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +sp-rpc = { version = "2.0.0-rc1", path = "../../primitives/rpc" } diff --git a/client/rpc-servers/Cargo.toml b/client/rpc-servers/Cargo.toml index a57baf1db7..65f4bb1a1e 100644 --- a/client/rpc-servers/Cargo.toml +++ b/client/rpc-servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-server" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -17,7 +17,7 @@ pubsub = { package = "jsonrpc-pubsub", version = "14.0.3" } log = "0.4.8" serde = "1.0.101" serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } [target.'cfg(not(target_os = "unknown"))'.dependencies] http = { package = "jsonrpc-http-server", version = "14.0.3" } diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index 94d4b38600..ed67592741 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,38 +12,38 @@ description = "Substrate Client RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-rpc-api = { version = "0.8.0-dev", path = "../rpc-api" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } +sc-rpc-api = { version = "0.8.0-rc1", path = "../rpc-api" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.1", features = ["compat"] } jsonrpc-pubsub = "14.0.3" log = "0.4.8" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } rpc = { package = "jsonrpc-core", version = "14.0.3" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } serde_json = "1.0.41" -sp-session = { version = "2.0.0-dev", path = "../../primitives/session" } -sp-offchain = { version = "2.0.0-dev", path = "../../primitives/offchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-rpc = { version = "2.0.0-dev", path = "../../primitives/rpc" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-chain-spec = { version = "2.0.0-dev", path = "../../primitives/chain-spec" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sc-block-builder = { version = "0.8.0-dev", path = "../../client/block-builder" } -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } +sp-session = { version = "2.0.0-rc1", path = "../../primitives/session" } +sp-offchain = { version = "2.0.0-rc1", path = "../../primitives/offchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sp-rpc = { version = "2.0.0-rc1", path = "../../primitives/rpc" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sp-chain-spec = { version = "2.0.0-rc1", path = "../../primitives/chain-spec" } +sc-executor = { version = "0.8.0-rc1", path = "../executor" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../client/block-builder" } +sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } hash-db = { version = "0.15.2", default-features = false } parking_lot = "0.10.0" [dev-dependencies] assert_matches = "1.3.0" futures01 = { package = "futures", version = "0.1.29" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } tokio = "0.1.22" -sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../transaction-pool" } lazy_static = "1.4.0" diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 5a026e5890..699da80c46 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -39,38 +39,38 @@ hash-db = "0.15.2" serde = "1.0.101" serde_json = "1.0.41" sysinfo = "0.13.3" -sc-keystore = { version = "2.0.0-dev", path = "../keystore" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-trie = { version = "2.0.0-dev", path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-session = { version = "2.0.0-dev", path = "../../primitives/session" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sc-network = { version = "0.8.0-dev", path = "../network" } -sc-chain-spec = { version = "2.0.0-dev", path = "../chain-spec" } -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../db" } +sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-session = { version = "2.0.0-rc1", path = "../../primitives/session" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../primitives/application-crypto" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sc-network = { version = "0.8.0-rc1", path = "../network" } +sc-chain-spec = { version = "2.0.0-rc1", path = "../chain-spec" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sc-client-db = { version = "0.8.0-rc1", default-features = false, path = "../db" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor = { version = "0.8.0-dev", path = "../executor" } -sc-transaction-pool = { version = "2.0.0-dev", path = "../transaction-pool" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sc-rpc-server = { version = "2.0.0-dev", path = "../rpc-servers" } -sc-rpc = { version = "2.0.0-dev", path = "../rpc" } -sc-block-builder = { version = "0.8.0-dev", path = "../block-builder" } -sp-block-builder = { version = "2.0.0-dev", path = "../../primitives/block-builder" } +sc-executor = { version = "0.8.0-rc1", path = "../executor" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../transaction-pool" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +sc-rpc-server = { version = "2.0.0-rc1", path = "../rpc-servers" } +sc-rpc = { version = "2.0.0-rc1", path = "../rpc" } +sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } +sp-block-builder = { version = "2.0.0-rc1", path = "../../primitives/block-builder" } -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } -sc-offchain = { version = "2.0.0-dev", path = "../offchain" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +sc-offchain = { version = "2.0.0-rc1", path = "../offchain" } parity-multiaddr = { package = "parity-multiaddr", version = "0.7.3" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-dev"} -sc-tracing = { version = "2.0.0-dev", path = "../tracing" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-rc1"} +sc-tracing = { version = "2.0.0-rc1", path = "../tracing" } tracing = "0.1.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } @@ -83,7 +83,7 @@ procfs = '0.7.8' [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-dev", path = "../../primitives/consensus/babe" } -grandpa = { version = "0.8.0-dev", package = "sc-finality-grandpa", path = "../finality-grandpa" } -grandpa-primitives = { version = "2.0.0-dev", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-rc1", path = "../../primitives/consensus/babe" } +grandpa = { version = "0.8.0-rc1", package = "sc-finality-grandpa", path = "../finality-grandpa" } +grandpa-primitives = { version = "2.0.0-rc1", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index c44f436513..d846638dca 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,24 +20,24 @@ log = "0.4.8" env_logger = "0.7.0" fdlimit = "0.1.4" parking_lot = "0.10.0" -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } -sp-trie = { version = "2.0.0-dev", path = "../../../primitives/trie" } -sp-storage = { version = "2.0.0-dev", path = "../../../primitives/storage" } -sc-client-db = { version = "0.8.0-dev", default-features = false, path = "../../db" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +sp-externalities = { version = "0.8.0-rc1", path = "../../../primitives/externalities" } +sp-trie = { version = "2.0.0-rc1", path = "../../../primitives/trie" } +sp-storage = { version = "2.0.0-rc1", path = "../../../primitives/storage" } +sc-client-db = { version = "0.8.0-rc1", default-features = false, path = "../../db" } futures = { version = "0.3.1", features = ["compat"] } -sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../service" } -sc-network = { version = "0.8.0-dev", path = "../../network" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sc-client-api = { version = "2.0.0-dev", path = "../../api" } -sc-block-builder = { version = "0.8.0-dev", path = "../../block-builder" } -sc-executor = { version = "0.8.0-dev", path = "../../executor" } -sp-panic-handler = { version = "2.0.0-dev", path = "../../../primitives/panic-handler" } +sc-service = { version = "0.8.0-rc1", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-network = { version = "0.8.0-rc1", path = "../../network" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../block-builder" } +sc-executor = { version = "0.8.0-rc1", path = "../../executor" } +sp-panic-handler = { version = "2.0.0-rc1", path = "../../../primitives/panic-handler" } parity-scale-codec = "1.3.0" diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index f4f084bc89..ddcaa1f139 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-state-db" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = "0.10.0" log = "0.4.8" -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parity-util-mem-derive = "0.1.0" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index bf8440356f..0f78e5d5bf 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-telemetry" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 52fa8d6600..1a59106bbe 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-tracing" -version = "2.0.0-dev" +version = "2.0.0-rc1" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -20,7 +20,7 @@ serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } tracing-core = "0.1.7" -sc-telemetry = { version = "2.0.0-dev", path = "../telemetry" } +sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } [dev-dependencies] tracing = "0.1.10" diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index 8b51bc7418..de3d34f1d4 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,21 +20,21 @@ intervalier = "0.4.0" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parking_lot = "0.10.0" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-dev"} -sc-client-api = { version = "2.0.0-dev", path = "../api" } -sc-transaction-graph = { version = "2.0.0-dev", path = "./graph" } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-dev", path = "../../primitives/tracing" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-utils = { version = "2.0.0-dev", path = "../../primitives/utils" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} +sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sc-transaction-graph = { version = "2.0.0-rc1", path = "./graph" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-rc1", path = "../../primitives/tracing" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } wasm-timer = "0.2" [dev-dependencies] assert_matches = "1.3.0" hex = "0.4" -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -substrate-test-runtime-transaction-pool = { version = "2.0.0-dev", path = "../../test-utils/runtime/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +substrate-test-runtime-transaction-pool = { version = "2.0.0-rc1", path = "../../test-utils/runtime/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index 4f9131aa96..d7ad5db6a5 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-graph" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,18 +18,18 @@ log = "0.4.8" parking_lot = "0.10.0" serde = { version = "1.0.101", features = ["derive"] } wasm-timer = "0.2" -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-utils = { version = "2.0.0-dev", path = "../../../primitives/utils" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-utils = { version = "2.0.0-rc1", path = "../../../primitives/utils" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } linked-hash-map = "0.5.2" [dev-dependencies] assert_matches = "1.3.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../../test-utils/runtime" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../../test-utils/runtime" } criterion = "0.3" [[bench]] diff --git a/frame/assets/Cargo.toml b/frame/assets/Cargo.toml index dc2a838d1c..9b34e968ee 100644 --- a/frame/assets/Cargo.toml +++ b/frame/assets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-assets" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } # Needed for various traits. In our case, `OnFinalize`. -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } # Needed for type-safe access to storage DB. -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } # `system` module provides us with all sorts of useful stuff and macros depend on it being around. -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index 5a8445d270..7221d2c2ce 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-aura" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,23 +12,23 @@ description = "FRAME AURA consensus pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -sp-consensus-aura = { version = "0.8.0-dev", path = "../../primitives/consensus/aura", default-features = false } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } +pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +sp-consensus-aura = { version = "0.8.0-rc1", path = "../../primitives/consensus/aura", default-features = false } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/timestamp" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } lazy_static = "1.4.0" parking_lot = "0.10.0" diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index 24cbdbde0a..99a17ec910 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME pallet for authority discovery" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-authority-discovery = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authority-discovery" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-authority-discovery = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/authority-discovery" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-dev", features = ["historical" ], path = "../session", default-features = false } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc1", features = ["historical" ], path = "../session", default-features = false } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } [features] default = ["std"] diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index 43a48b02a0..32faaa23b1 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authorship" -version = "2.0.0-dev" +version = "2.0.0-rc1" description = "Block and Uncle Author tracking for the FRAME" authors = ["Parity Technologies "] edition = "2018" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-authorship = { version = "2.0.0-dev", default-features = false, path = "../../primitives/authorship" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-authorship = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/authorship" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 23946203f3..6ad153ed5a 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-babe" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,22 +14,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } -sp-consensus-vrf = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/vrf" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/timestamp" } +pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } +sp-consensus-babe = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/babe" } +sp-consensus-vrf = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/vrf" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index 18b6fe8ced..9fc875f907 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-balances" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-transaction-payment = { version = "2.0.0-rc1", path = "../transaction-payment" } [features] default = ["std"] diff --git a/frame/benchmark/Cargo.toml b/frame/benchmark/Cargo.toml index 7fab3642f2..2d5f32d58e 100644 --- a/frame/benchmark/Cargo.toml +++ b/frame/benchmark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-benchmark" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std"] diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index dd7de60c57..078283dfac 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,13 +15,13 @@ targets = ["x86_64-unknown-linux-gnu"] linregress = "0.1" paste = "0.1" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api = { version = "2.0.0-dev", path = "../../primitives/api", default-features = false } -sp-runtime-interface = { version = "2.0.0-dev", path = "../../primitives/runtime-interface", default-features = false } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime", default-features = false } -sp-std = { version = "2.0.0-dev", path = "../../primitives/std", default-features = false } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-api = { version = "2.0.0-rc1", path = "../../primitives/api", default-features = false } +sp-runtime-interface = { version = "2.0.0-rc1", path = "../../primitives/runtime-interface", default-features = false } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime", default-features = false } +sp-std = { version = "2.0.0-rc1", path = "../../primitives/std", default-features = false } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io", default-features = false } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [features] default = [ "std" ] diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index f2a7f46b06..5a44cd8c79 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-collective" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index 3350e815b2..b0f3760a3d 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,23 +17,23 @@ pwasm-utils = { version = "0.12.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } parity-wasm = { version = "0.41.0", default-features = false } wasmi-validation = { version = "0.3.0", default-features = false } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-sandbox = { version = "0.8.0-dev", default-features = false, path = "../../primitives/sandbox" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "common" } -pallet-transaction-payment = { version = "2.0.0-dev", default-features = false, path = "../transaction-payment" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-sandbox = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/sandbox" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-contracts-primitives = { version = "2.0.0-rc1", default-features = false, path = "common" } +pallet-transaction-payment = { version = "2.0.0-rc1", default-features = false, path = "../transaction-payment" } [dev-dependencies] wabt = "0.9.2" assert_matches = "1.3.0" hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } -pallet-randomness-collective-flip = { version = "2.0.0-dev", path = "../randomness-collective-flip" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../timestamp" } +pallet-randomness-collective-flip = { version = "2.0.0-rc1", path = "../randomness-collective-flip" } [features] default = ["std"] diff --git a/frame/contracts/common/Cargo.toml b/frame/contracts/common/Cargo.toml index d834be7437..00fa3917bc 100644 --- a/frame/contracts/common/Cargo.toml +++ b/frame/contracts/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-primitives" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # This crate should not rely on any of the frame primitives. codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } [features] default = ["std"] diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index f3d32e7696..4bc3c84cb8 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-dev", path = "../../../primitives/rpc" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-rc1", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -pallet-contracts-primitives = { version = "2.0.0-dev", path = "../common" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-dev", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +pallet-contracts-primitives = { version = "2.0.0-rc1", path = "../common" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-rc1", path = "./runtime-api" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index fdcfb5149a..93b945c053 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Runtime API definition required by Contracts RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/runtime" } -pallet-contracts-primitives = { version = "2.0.0-dev", default-features = false, path = "../../common" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/runtime" } +pallet-contracts-primitives = { version = "2.0.0-rc1", default-features = false, path = "../../common" } [features] default = ["std"] diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 5c339d2bc5..040571c5b3 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-democracy" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-scheduler = { version = "2.0.0-dev", path = "../scheduler" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-scheduler = { version = "2.0.0-rc1", path = "../scheduler" } +sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } +substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } hex-literal = "0.2.1" [features] diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index f9a3ec0b21..3a46b710b6 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections-phragmen" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/phragmen" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } [features] default = ["std"] diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index 3109a13392..af5bc6d558 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index c7aea6eb9b..6d14dd1d95 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-evm" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } +pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } primitive-types = { version = "0.7.0", default-features = false, features = ["rlp"] } rlp = { version = "0.4", default-features = false } evm = { version = "0.16", default-features = false } diff --git a/frame/example-offchain-worker/Cargo.toml b/frame/example-offchain-worker/Cargo.toml index 30381adb49..d6ff25c841 100644 --- a/frame/example-offchain-worker/Cargo.toml +++ b/frame/example-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example-offchain-worker" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -13,13 +13,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } lite-json = { version = "0.1", default-features = false } [features] diff --git a/frame/example/Cargo.toml b/frame/example/Cargo.toml index d12b1e7c83..caeb34f532 100644 --- a/frame/example/Cargo.toml +++ b/frame/example/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index edfd207bc9..07df7ce5a0 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-executive" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,22 +13,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../../primitives/tracing" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/tracing" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } [dev-dependencies] hex-literal = "0.2.1" -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -pallet-indices = { version = "2.0.0-dev", path = "../indices" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-transaction-payment = { version = "2.0.0-dev", path = "../transaction-payment" } -sp-version = { version = "2.0.0-dev", path = "../../primitives/version" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +pallet-indices = { version = "2.0.0-rc1", path = "../indices" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-transaction-payment = { version = "2.0.0-rc1", path = "../transaction-payment" } +sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } [features] default = ["std"] diff --git a/frame/finality-tracker/Cargo.toml b/frame/finality-tracker/Cargo.toml index 9c2019bfb5..02c15eebeb 100644 --- a/frame/finality-tracker/Cargo.toml +++ b/frame/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,17 +16,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-tracker" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/finality-tracker" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/generic-asset/Cargo.toml b/frame/generic-asset/Cargo.toml index 9b32d718ac..4e2f85e890 100644 --- a/frame/generic-asset/Cargo.toml +++ b/frame/generic-asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-generic-asset" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Centrality Developers "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index 7a9a00a282..9146b17a9e 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-grandpa" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,27 +14,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-finality-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-grandpa" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -pallet-finality-tracker = { version = "2.0.0-dev", default-features = false, path = "../finality-tracker" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-finality-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/finality-grandpa" } +sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/session" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } +pallet-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../finality-tracker" } [dev-dependencies] grandpa = { package = "finality-grandpa", version = "0.12.3", features = ["derive-codec"] } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-offences = { version = "2.0.0-dev", path = "../offences" } -pallet-staking = { version = "2.0.0-dev", path = "../staking" } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-offences = { version = "2.0.0-rc1", path = "../offences" } +pallet-staking = { version = "2.0.0-rc1", path = "../staking" } +pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../timestamp" } [features] default = ["std"] diff --git a/frame/identity/Cargo.toml b/frame/identity/Cargo.toml index bfe2a7d492..5973f12988 100644 --- a/frame/identity/Cargo.toml +++ b/frame/identity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-identity" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/im-online/Cargo.toml b/frame/im-online/Cargo.toml index 964bd2f69a..29dc1af011 100644 --- a/frame/im-online/Cargo.toml +++ b/frame/im-online/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-im-online" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME's I'm online pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +pallet-authorship = { version = "2.0.0-rc1", default-features = false, path = "../authorship" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../session" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std", "pallet-session/historical"] diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index db0f4cbf55..32b5b81c64 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-indices" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../primitives/keyring" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-keyring = { version = "2.0.0-rc1", optional = true, path = "../../primitives/keyring" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/membership/Cargo.toml b/frame/membership/Cargo.toml index befca54ad1..e881364579 100644 --- a/frame/membership/Cargo.toml +++ b/frame/membership/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-membership" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index 1241c3b4ab..71ae6858ee 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-metadata" -version = "11.0.0-dev" +version = "11.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/nicks/Cargo.toml b/frame/nicks/Cargo.toml index 140a48523b..059e81408b 100644 --- a/frame/nicks/Cargo.toml +++ b/frame/nicks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-nicks" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/offences/Cargo.toml b/frame/offences/Cargo.toml index ebb31d680d..92770ba47b 100644 --- a/frame/offences/Cargo.toml +++ b/frame/offences/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,18 +12,18 @@ description = "FRAME offences pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } +pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/offences/benchmarking/Cargo.toml b/frame/offences/benchmarking/Cargo.toml index e9cd2be005..c4564d6c82 100644 --- a/frame/offences/benchmarking/Cargo.toml +++ b/frame/offences/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,27 +13,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } -pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../babe" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../../balances" } -pallet-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../grandpa" } -pallet-im-online = { version = "2.0.0-dev", default-features = false, path = "../../im-online" } -pallet-offences = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } -pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/staking" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../system" } +pallet-babe = { version = "2.0.0-rc1", default-features = false, path = "../../babe" } +pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../../balances" } +pallet-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../grandpa" } +pallet-im-online = { version = "2.0.0-rc1", default-features = false, path = "../../im-online" } +pallet-offences = { version = "2.0.0-rc1", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } +pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../../session" } +pallet-staking = { version = "2.0.0-rc1", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/staking" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } [dev-dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../../timestamp" } serde = { version = "1.0.101" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/frame/randomness-collective-flip/Cargo.toml b/frame/randomness-collective-flip/Cargo.toml index 2c6e733cae..7653d2256b 100644 --- a/frame/randomness-collective-flip/Cargo.toml +++ b/frame/randomness-collective-flip/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-randomness-collective-flip" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] safe-mix = { version = "1.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml index b0a5982714..482cde4cd2 100644 --- a/frame/recovery/Cargo.toml +++ b/frame/recovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-recovery" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,15 +15,15 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/scheduler/Cargo.toml b/frame/scheduler/Cargo.toml index 6cc9161eea..e150d3b43b 100644 --- a/frame/scheduler/Cargo.toml +++ b/frame/scheduler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scheduler" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -11,16 +11,16 @@ description = "FRAME example pallet" [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.2.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/scored-pool/Cargo.toml b/frame/scored-pool/Cargo.toml index 83d1402957..e72e1bd1ad 100644 --- a/frame/scored-pool/Cargo.toml +++ b/frame/scored-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scored-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index 8031804fcd..b653f2bd98 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../timestamp" } -sp-trie = { version = "2.0.0-dev", optional = true, default-features = false, path = "../../primitives/trie" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/session" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } +sp-trie = { version = "2.0.0-rc1", optional = true, default-features = false, path = "../../primitives/trie" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-application-crypto = { version = "2.0.0-dev", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../../primitives/application-crypto" } lazy_static = "1.4.0" [features] diff --git a/frame/session/benchmarking/Cargo.toml b/frame/session/benchmarking/Cargo.toml index 20ef9c6eb6..c8fa5d4453 100644 --- a/frame/session/benchmarking/Cargo.toml +++ b/frame/session/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ description = "FRAME sessions pallet benchmarking" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } -pallet-staking = { version = "2.0.0-dev", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -pallet-session = { version = "2.0.0-dev", default-features = false, path = "../../session" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../system" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../support" } +pallet-staking = { version = "2.0.0-rc1", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../../session" } [dev-dependencies] serde = { version = "1.0.101" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../../staking/reward-curve" } -sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } -pallet-balances = { version = "2.0.0-dev", path = "../../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../../staking/reward-curve" } +sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../../timestamp" } +pallet-balances = { version = "2.0.0-rc1", path = "../../balances" } [features] default = ["std"] diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index 86c800d571..41162f457c 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-society" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } rand_chacha = { version = "0.2", default-features = false } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index 3147e79803..f6fa826a3d 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,29 +15,29 @@ targets = ["x86_64-unknown-linux-gnu"] static_assertions = "1.1.0" serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-phragmen = { version = "2.0.0-dev", default-features = false, path = "../../primitives/phragmen" } -sp-io ={ version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-dev", default-features = false, features = ["historical"], path = "../session" } -pallet-authorship = { version = "2.0.0-dev", default-features = false, path = "../authorship" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-phragmen = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/phragmen" } +sp-io ={ version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc1", default-features = false, features = ["historical"], path = "../session" } +pallet-authorship = { version = "2.0.0-rc1", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } # Optional imports for benchmarking -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } rand_chacha = { version = "0.2", default-features = false, optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -pallet-timestamp = { version = "2.0.0-dev", path = "../timestamp" } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../staking/reward-curve" } -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } -frame-benchmarking = { version = "2.0.0-dev", path = "../benchmarking" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../staking/reward-curve" } +substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } +frame-benchmarking = { version = "2.0.0-rc1", path = "../benchmarking" } rand_chacha = { version = "0.2" } parking_lot = "0.10.2" env_logger = "0.7.1" diff --git a/frame/staking/fuzzer/Cargo.lock b/frame/staking/fuzzer/Cargo.lock index a45f33fdce..b73462e2df 100644 --- a/frame/staking/fuzzer/Cargo.lock +++ b/frame/staking/fuzzer/Cargo.lock @@ -1763,7 +1763,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/frame/staking/fuzzer/Cargo.toml b/frame/staking/fuzzer/Cargo.toml index 44075aa572..edd3037a7e 100644 --- a/frame/staking/fuzzer/Cargo.toml +++ b/frame/staking/fuzzer/Cargo.toml @@ -15,19 +15,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] honggfuzz = "0.5" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -pallet-staking = { version = "2.0.0-dev", path = "..", features = ["runtime-benchmarks"] } -pallet-staking-reward-curve = { version = "2.0.0-dev", path = "../reward-curve" } -pallet-session = { version = "2.0.0-dev", path = "../../session" } -pallet-indices = { version = "2.0.0-dev", path = "../../indices" } -pallet-balances = { version = "2.0.0-dev", path = "../../balances" } -pallet-timestamp = { version = "2.0.0-dev", path = "../../timestamp" } -frame-system = { version = "2.0.0-dev", path = "../../system" } -frame-support = { version = "2.0.0-dev", path = "../../support" } -sp-std = { version = "2.0.0-dev", path = "../../../primitives/std" } -sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-phragmen = { version = "2.0.0-dev", path = "../../../primitives/phragmen" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-rc1", path = "..", features = ["runtime-benchmarks"] } +pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../reward-curve" } +pallet-session = { version = "2.0.0-rc1", path = "../../session" } +pallet-indices = { version = "2.0.0-rc1", path = "../../indices" } +pallet-balances = { version = "2.0.0-rc1", path = "../../balances" } +pallet-timestamp = { version = "2.0.0-rc1", path = "../../timestamp" } +frame-system = { version = "2.0.0-rc1", path = "../../system" } +frame-support = { version = "2.0.0-rc1", path = "../../support" } +sp-std = { version = "2.0.0-rc1", path = "../../../primitives/std" } +sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-phragmen = { version = "2.0.0-rc1", path = "../../../primitives/phragmen" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } [[bin]] name = "submit_solution" diff --git a/frame/staking/reward-curve/Cargo.toml b/frame/staking/reward-curve/Cargo.toml index b5ec29060a..3e6e4ca738 100644 --- a/frame/staking/reward-curve/Cargo.toml +++ b/frame/staking/reward-curve/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking-reward-curve" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -21,4 +21,4 @@ proc-macro2 = "1.0.6" proc-macro-crate = "0.1.4" [dev-dependencies] -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } diff --git a/frame/sudo/Cargo.toml b/frame/sudo/Cargo.toml index bbceac1496..f6df3ec03e 100644 --- a/frame/sudo/Cargo.toml +++ b/frame/sudo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-sudo" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 61363be2df..ba98adb8fc 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,25 +15,25 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4" serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-metadata = { version = "11.0.0-dev", default-features = false, path = "../metadata" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../../primitives/tracing" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../../primitives/arithmetic" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -frame-support-procedural = { version = "2.0.0-dev", path = "./procedural" } +frame-metadata = { version = "11.0.0-rc1", default-features = false, path = "../metadata" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/tracing" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-arithmetic = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/arithmetic" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +frame-support-procedural = { version = "2.0.0-rc1", path = "./procedural" } paste = "0.1.6" once_cell = { version = "1", default-features = false, optional = true } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../primitives/state-machine" } bitmask = { version = "0.5.0", default-features = false } impl-trait-for-tuples = "0.1.3" smallvec = "1.4.0" [dev-dependencies] pretty_assertions = "0.6.1" -frame-system = { version = "2.0.0-dev", path = "../system" } +frame-system = { version = "2.0.0-rc1", path = "../system" } [features] default = ["std"] diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 4d05685f9d..90c90f4ca0 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -frame-support-procedural-tools = { version = "2.0.0-dev", path = "./tools" } +frame-support-procedural-tools = { version = "2.0.0-rc1", path = "./tools" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full"] } diff --git a/frame/support/procedural/tools/Cargo.toml b/frame/support/procedural/tools/Cargo.toml index 5e5e0eb4c4..2f6d124063 100644 --- a/frame/support/procedural/tools/Cargo.toml +++ b/frame/support/procedural/tools/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Proc macro helpers for procedural macros" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-support-procedural-tools-derive = { version = "2.0.0-dev", path = "./derive" } +frame-support-procedural-tools-derive = { version = "2.0.0-rc1", path = "./derive" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full", "visit"] } diff --git a/frame/support/procedural/tools/derive/Cargo.toml b/frame/support/procedural/tools/derive/Cargo.toml index 7cc657e685..20d427de47 100644 --- a/frame/support/procedural/tools/derive/Cargo.toml +++ b/frame/support/procedural/tools/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools-derive" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index e676106e17..8b858cf5b0 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io", default-features = false } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../../primitives/state-machine" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/inherents" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io", default-features = false } +sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../../primitives/state-machine" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/inherents" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } trybuild = "1.0.17" pretty_assertions = "0.6.1" rustversion = "1.0.0" diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index 254938df2b..b88553729d 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", path = "../../primitives/io", default-features = false } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io", default-features = false } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/version" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] criterion = "0.2.11" -sp-externalities = { version = "0.8.0-dev", path = "../../primitives/externalities" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../test-utils/runtime/client" } +sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } [features] default = ["std"] diff --git a/frame/system/benchmarking/Cargo.toml b/frame/system/benchmarking/Cargo.toml index 7ce619f413..748dc31467 100644 --- a/frame/system/benchmarking/Cargo.toml +++ b/frame/system/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-benchmarking" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../../benchmarking" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../system" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../support" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../benchmarking" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../system" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../support" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } [dev-dependencies] serde = { version = "1.0.101" } -sp-io ={ version = "2.0.0-dev", path = "../../../primitives/io" } +sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/frame/system/rpc/runtime-api/Cargo.toml b/frame/system/rpc/runtime-api/Cargo.toml index d0644931ae..72e2837037 100644 --- a/frame/system/rpc/runtime-api/Cargo.toml +++ b/frame/system/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Runtime API definition required by System RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [features] diff --git a/frame/timestamp/Cargo.toml b/frame/timestamp/Cargo.toml index 49abf80254..6146700cd5 100644 --- a/frame/timestamp/Cargo.toml +++ b/frame/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-timestamp" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,19 +16,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io", optional = true } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../primitives/timestamp" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io", optional = true } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/timestamp" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index 56efe907f5..e4af397388 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,18 +13,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "./rpc/runtime-api" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "./rpc/runtime-api" } smallvec = "1.4.0" [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } [features] default = ["std"] diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index 3851c988e2..e3e935c3c8 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,10 +16,10 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-dev", path = "../../../primitives/rpc" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-rc1", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-dev", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc1", path = "./runtime-api" } diff --git a/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/frame/transaction-payment/rpc/runtime-api/Cargo.toml index f8e948ea10..4466a2e53d 100644 --- a/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../../support" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../support" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/treasury/Cargo.toml b/frame/treasury/Cargo.toml index 9b031c4a0c..a78037ebe0 100644 --- a/frame/treasury/Cargo.toml +++ b/frame/treasury/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-treasury" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-dev", default-features = false, path = "../balances" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io ={ version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index fff5513682..b6c7fffdaa 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-utility" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } [features] default = ["std"] diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml index 70c97006df..311fd5ae40 100644 --- a/frame/vesting/Cargo.toml +++ b/frame/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-vesting" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,17 +15,17 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-dev", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io = { version = "2.0.0-dev", path = "../../primitives/io" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-dev", path = "../balances" } -sp-storage = { version = "2.0.0-dev", path = "../../primitives/storage" } +sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } hex-literal = "0.2.1" [features] diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml index d56b4e34b2..e83d70b4dc 100644 --- a/primitives/allocator/Cargo.toml +++ b/primitives/allocator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-allocator" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,9 +13,9 @@ documentation = "https://docs.rs/sp-allocator" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", path = "../std", default-features = false } -sp-core = { version = "2.0.0-dev", path = "../core", default-features = false } -sp-wasm-interface = { version = "2.0.0-dev", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-rc1", path = "../std", default-features = false } +sp-core = { version = "2.0.0-rc1", path = "../core", default-features = false } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../wasm-interface", default-features = false } log = { version = "0.4.8", optional = true } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index f82bcac77e..f38da4da0c 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api-proc-macro = { version = "2.0.0-dev", path = "proc-macro" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../version" } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } +sp-api-proc-macro = { version = "2.0.0-rc1", path = "proc-macro" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-version = { version = "2.0.0-rc1", default-features = false, path = "../version" } +sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../primitives/state-machine" } hash-db = { version = "0.15.2", optional = true } [dev-dependencies] -sp-test-primitives = { version = "2.0.0-dev", path = "../test-primitives" } +sp-test-primitives = { version = "2.0.0-rc1", path = "../test-primitives" } [features] default = [ "std" ] diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index 46f804f32c..c0441de584 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index 9e2d894a01..0760472b77 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", path = "../" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sp-version = { version = "2.0.0-dev", path = "../../version" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-blockchain = { version = "2.0.0-dev", path = "../../blockchain" } -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } +sp-api = { version = "2.0.0-rc1", path = "../" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +sp-version = { version = "2.0.0-rc1", path = "../../version" } +sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../blockchain" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } trybuild = "1.0.17" rustversion = "1.0.0" [dev-dependencies] criterion = "0.3.0" -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sp-core = { version = "2.0.0-dev", path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +sp-core = { version = "2.0.0-rc1", path = "../../core" } [[bench]] name = "bench" diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index b350dee843..fa13fd947e 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" description = "Provides facilities for generating application specific crypto wrapper types." @@ -14,11 +14,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } [features] default = [ "std" ] diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index 6e2c81f3a6..284af732a1 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" description = "Integration tests for application-crypto" @@ -13,8 +13,8 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../test-utils/runtime/client" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-api = { version = "2.0.0-dev", path = "../../api" } -sp-application-crypto = { version = "2.0.0-dev", path = "../" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../api" } +sp-application-crypto = { version = "2.0.0-rc1", path = "../" } diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index 9d080d6010..50eab59c86 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } integer-sqrt = "0.1.2" num-traits = { version = "0.2.8", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-debug-derive = { version = "2.0.0-dev", default-features = false, path = "../../primitives/debug-derive" } +sp-debug-derive = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/debug-derive" } [dev-dependencies] rand = "0.7.2" diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index c4842adc84..c388d0259f 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic-fuzzer" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-arithmetic = { version = "2.0.0-dev", path = ".." } +sp-arithmetic = { version = "2.0.0-rc1", path = ".." } honggfuzz = "0.5.49" primitive-types = "0.7.0" num-bigint = "0.2" diff --git a/primitives/authority-discovery/Cargo.toml b/primitives/authority-discovery/Cargo.toml index 286a2e3141..5d3db31f8a 100644 --- a/primitives/authority-discovery/Cargo.toml +++ b/primitives/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authority-discovery" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Authority discovery primitives" edition = "2018" @@ -12,11 +12,11 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", default-features = false, version = "1.3.0" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/authorship/Cargo.toml b/primitives/authorship/Cargo.toml index 0888878ab8..f28f5b6efe 100644 --- a/primitives/authorship/Cargo.toml +++ b/primitives/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authorship" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Authorship primitives" edition = "2018" @@ -12,9 +12,9 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/block-builder/Cargo.toml b/primitives/block-builder/Cargo.toml index b9793621c9..565caffe9d 100644 --- a/primitives/block-builder/Cargo.toml +++ b/primitives/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-block-builder" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "The block builder runtime api." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } [features] default = [ "std" ] diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index 9eb619ccb9..36d13f0cec 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-blockchain" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,7 +19,7 @@ lru = "0.4.0" parking_lot = "0.10.0" derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-dev", path = "../consensus/common" } -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } -sp-block-builder = { version = "2.0.0-dev", path = "../block-builder" } -sp-state-machine = { version = "0.8.0-dev", path = "../state-machine" } +sp-consensus = { version = "0.8.0-rc1", path = "../consensus/common" } +sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sp-block-builder = { version = "2.0.0-rc1", path = "../block-builder" } +sp-state-machine = { version = "0.8.0-rc1", path = "../state-machine" } diff --git a/primitives/chain-spec/Cargo.toml b/primitives/chain-spec/Cargo.toml index 1d482c5970..d530592fec 100644 --- a/primitives/chain-spec/Cargo.toml +++ b/primitives/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-chain-spec" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/consensus/aura/Cargo.toml b/primitives/consensus/aura/Cargo.toml index b907b5689b..9323788300 100644 --- a/primitives/consensus/aura/Cargo.toml +++ b/primitives/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-aura" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,13 +12,13 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../inherents" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../api" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../inherents" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/babe/Cargo.toml b/primitives/consensus/babe/Cargo.toml index 6a5da2788f..3a92b2f2c6 100644 --- a/primitives/consensus/babe/Cargo.toml +++ b/primitives/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-babe" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" @@ -12,16 +12,16 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } merlin = { version = "2.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } -sp-consensus = { version = "0.8.0-dev", optional = true, path = "../common" } -sp-consensus-vrf = { version = "0.8.0-dev", path = "../vrf", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../inherents" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } -sp-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../api" } +sp-consensus = { version = "0.8.0-rc1", optional = true, path = "../common" } +sp-consensus-vrf = { version = "0.8.0-rc1", path = "../vrf", default-features = false } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../inherents" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } +sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index b7b0f111de..a652569895 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,22 +17,22 @@ targets = ["x86_64-unknown-linux-gnu"] derive_more = "0.99.2" libp2p = { version = "0.19.1", default-features = false } log = "0.4.8" -sp-core = { path= "../../core", version = "2.0.0-dev"} -sp-inherents = { version = "2.0.0-dev", path = "../../inherents" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +sp-core = { path= "../../core", version = "2.0.0-rc1"} +sp-inherents = { version = "2.0.0-rc1", path = "../../inherents" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } futures-timer = "3.0.1" -sp-std = { version = "2.0.0-dev", path = "../../std" } -sp-version = { version = "2.0.0-dev", path = "../../version" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-utils = { version = "2.0.0-dev", path = "../../utils" } +sp-std = { version = "2.0.0-rc1", path = "../../std" } +sp-version = { version = "2.0.0-rc1", path = "../../version" } +sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } +sp-utils = { version = "2.0.0-rc1", path = "../../utils" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" serde = { version = "1.0", features = ["derive"] } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-dev"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} [dev-dependencies] -sp-test-primitives = { version = "2.0.0-dev", path = "../../test-primitives" } +sp-test-primitives = { version = "2.0.0-rc1", path = "../../test-primitives" } [features] default = [] diff --git a/primitives/consensus/pow/Cargo.toml b/primitives/consensus/pow/Cargo.toml index aedc50ab51..8ac24db410 100644 --- a/primitives/consensus/pow/Cargo.toml +++ b/primitives/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-pow" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../api" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../api" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/consensus/vrf/Cargo.toml b/primitives/consensus/vrf/Cargo.toml index fce027e7a0..cb4b270744 100644 --- a/primitives/consensus/vrf/Cargo.toml +++ b/primitives/consensus/vrf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-vrf" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Primitives for VRF based consensus" edition = "2018" @@ -14,9 +14,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { version = "1.0.0", package = "parity-scale-codec", default-features = false } schnorrkel = { version = "0.9.1", features = ["preaudit_deprecated", "u64_backend"], default-features = false } -sp-std = { version = "2.0.0-dev", path = "../../std", default-features = false } -sp-core = { version = "2.0.0-dev", path = "../../core", default-features = false } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../runtime" } +sp-std = { version = "2.0.0-rc1", path = "../../std", default-features = false } +sp-core = { version = "2.0.0-rc1", path = "../../core", default-features = false } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } [features] default = ["std"] diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index d028141d3d..85564274b0 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-core" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } log = { version = "0.4.8", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } @@ -33,9 +33,9 @@ num-traits = { version = "0.2.8", default-features = false } zeroize = { version = "1.0.0", default-features = false } lazy_static = { version = "1.4.0", default-features = false, optional = true } parking_lot = { version = "0.10.0", optional = true } -sp-debug-derive = { version = "2.0.0-dev", path = "../debug-derive" } -sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } -sp-storage = { version = "2.0.0-dev", default-features = false, path = "../storage" } +sp-debug-derive = { version = "2.0.0-rc1", path = "../debug-derive" } +sp-externalities = { version = "0.8.0-rc1", optional = true, path = "../externalities" } +sp-storage = { version = "2.0.0-rc1", default-features = false, path = "../storage" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } futures = { version = "0.3.1", optional = true } @@ -50,10 +50,10 @@ twox-hash = { version = "1.5.0", default-features = false, optional = true } libsecp256k1 = { version = "0.3.2", default-features = false, features = ["hmac"], optional = true } merlin = { version = "2.0", default-features = false, optional = true } -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../runtime-interface" } +sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../runtime-interface" } [dev-dependencies] -sp-serializer = { version = "2.0.0-dev", path = "../serializer" } +sp-serializer = { version = "2.0.0-rc1", path = "../serializer" } pretty_assertions = "0.6.1" hex-literal = "0.2.1" rand = "0.7.2" diff --git a/primitives/database/Cargo.toml b/primitives/database/Cargo.toml index ef65a8b940..5754227632 100644 --- a/primitives/database/Cargo.toml +++ b/primitives/database/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-database" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/debug-derive/Cargo.toml b/primitives/debug-derive/Cargo.toml index d620d2bc71..a703dcc5f1 100644 --- a/primitives/debug-derive/Cargo.toml +++ b/primitives/debug-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-debug-derive" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 31dde81d7e..66367b7e79 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-externalities" -version = "0.8.0-dev" +version = "0.8.0-rc1" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,7 +13,7 @@ documentation = "https://docs.rs/sp-externalities" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-storage = { version = "2.0.0-dev", path = "../storage" } -sp-std = { version = "2.0.0-dev", path = "../std" } +sp-storage = { version = "2.0.0-rc1", path = "../storage" } +sp-std = { version = "2.0.0-rc1", path = "../std" } environmental = { version = "1.1.1" } codec = { package = "parity-scale-codec", version = "1.3.0" } diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index 36af9319e7..a4154caac0 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-grandpa" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } grandpa = { package = "finality-grandpa", version = "0.12.3", default-features = false, features = ["derive-codec"] } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/finality-tracker/Cargo.toml b/primitives/finality-tracker/Cargo.toml index 9e40cb8551..c8e663455d 100644 --- a/primitives/finality-tracker/Cargo.toml +++ b/primitives/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-tracker" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } [features] default = ["std"] diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 287f4d7b9d..57434a2a7d 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-inherents" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = { version = "0.10.0", optional = true } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index 2bba4e94cb..ca12371406 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-io" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } hash-db = { version = "0.15.2", default-features = false } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } libsecp256k1 = { version = "0.3.4", optional = true } -sp-state-machine = { version = "0.8.0-dev", optional = true, path = "../../primitives/state-machine" } -sp-wasm-interface = { version = "2.0.0-dev", path = "../../primitives/wasm-interface", default-features = false } -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../runtime-interface" } -sp-trie = { version = "2.0.0-dev", optional = true, path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } +sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../primitives/state-machine" } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../../primitives/wasm-interface", default-features = false } +sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../runtime-interface" } +sp-trie = { version = "2.0.0-rc1", optional = true, path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-rc1", optional = true, path = "../externalities" } log = { version = "0.4.8", optional = true } futures = { version = "0.3.1", features = ["thread-pool"], optional = true } parking_lot = { version = "0.10.0", optional = true } diff --git a/primitives/keyring/Cargo.toml b/primitives/keyring/Cargo.toml index b9fe7cb7a0..b096e6d6c1 100644 --- a/primitives/keyring/Cargo.toml +++ b/primitives/keyring/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-keyring" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", path = "../core" } -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-core = { version = "2.0.0-rc1", path = "../core" } +sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } lazy_static = "1.4.0" strum = { version = "0.16.0", features = ["derive"] } diff --git a/primitives/offchain/Cargo.toml b/primitives/offchain/Cargo.toml index 1ed6c3342a..eb9e319869 100644 --- a/primitives/offchain/Cargo.toml +++ b/primitives/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers primitives" name = "sp-offchain" -version = "2.0.0-dev" +version = "2.0.0-rc1" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } [dev-dependencies] -sp-state-machine = { version = "0.8.0-dev", default-features = false, path = "../state-machine" } +sp-state-machine = { version = "0.8.0-rc1", default-features = false, path = "../state-machine" } [features] default = ["std"] diff --git a/primitives/panic-handler/Cargo.toml b/primitives/panic-handler/Cargo.toml index bc3ef2bdc6..886f979311 100644 --- a/primitives/panic-handler/Cargo.toml +++ b/primitives/panic-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-panic-handler" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/Cargo.toml b/primitives/phragmen/Cargo.toml index 3317b2fac0..021c60325c 100644 --- a/primitives/phragmen/Cargo.toml +++ b/primitives/phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-phragmen-compact = { version = "2.0.0-dev", path = "./compact" } -sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-phragmen-compact = { version = "2.0.0-rc1", path = "./compact" } +sp-arithmetic = { version = "2.0.0-rc1", default-features = false, path = "../arithmetic" } [dev-dependencies] -substrate-test-utils = { version = "2.0.0-dev", path = "../../test-utils" } +substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } rand = "0.7.3" -sp-phragmen = { version = "2.0.0-dev", path = "." } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-rc1", path = "." } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } [features] default = ["std"] diff --git a/primitives/phragmen/compact/Cargo.toml b/primitives/phragmen/compact/Cargo.toml index 1e5afd6c49..c3f8748a9d 100644 --- a/primitives/phragmen/compact/Cargo.toml +++ b/primitives/phragmen/compact/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen-compact" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/fuzzer/Cargo.lock b/primitives/phragmen/fuzzer/Cargo.lock index 49006f5be8..19f8114f36 100644 --- a/primitives/phragmen/fuzzer/Cargo.lock +++ b/primitives/phragmen/fuzzer/Cargo.lock @@ -1247,7 +1247,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-dev" +version = "2.0.0-rc1" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/primitives/phragmen/fuzzer/Cargo.toml b/primitives/phragmen/fuzzer/Cargo.toml index d81d23c476..82f33c173d 100644 --- a/primitives/phragmen/fuzzer/Cargo.toml +++ b/primitives/phragmen/fuzzer/Cargo.toml @@ -14,9 +14,9 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-phragmen = { version = "2.0.0-dev", path = ".." } -sp-std = { version = "2.0.0-dev", path = "../../std" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } +sp-phragmen = { version = "2.0.0-rc1", path = ".." } +sp-std = { version = "2.0.0-rc1", path = "../../std" } +sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } honggfuzz = "0.5" rand = { version = "0.7.3", features = ["std", "small_rng"] } diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index 4c9dfb5d7b..2b476bd872 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-rpc" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", features = ["derive"] } -sp-core = { version = "2.0.0-dev", path = "../core" } +sp-core = { version = "2.0.0-rc1", path = "../core" } [dev-dependencies] serde_json = "1.0.41" diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index df1b32d73f..0f78b410e3 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,20 +13,20 @@ documentation = "https://docs.rs/sp-runtime-interface/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-wasm-interface = { version = "2.0.0-dev", path = "../wasm-interface", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-tracing = { version = "2.0.0-dev", default-features = false, path = "../tracing" } -sp-runtime-interface-proc-macro = { version = "2.0.0-dev", path = "proc-macro" } -sp-externalities = { version = "0.8.0-dev", optional = true, path = "../externalities" } +sp-wasm-interface = { version = "2.0.0-rc1", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-tracing = { version = "2.0.0-rc1", default-features = false, path = "../tracing" } +sp-runtime-interface-proc-macro = { version = "2.0.0-rc1", path = "proc-macro" } +sp-externalities = { version = "0.8.0-rc1", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } static_assertions = "1.0.0" primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] -sp-runtime-interface-test-wasm = { version = "2.0.0-dev", path = "test-wasm" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } -sp-core = { version = "2.0.0-dev", path = "../core" } -sp-io = { version = "2.0.0-dev", path = "../io" } +sp-runtime-interface-test-wasm = { version = "2.0.0-rc1", path = "test-wasm" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-rc1", path = "../core" } +sp-io = { version = "2.0.0-rc1", path = "../io" } rustversion = "1.0.0" trybuild = "1.0.23" diff --git a/primitives/runtime-interface/proc-macro/Cargo.toml b/primitives/runtime-interface/proc-macro/Cargo.toml index 429168fe7b..4ea3fce0be 100644 --- a/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/primitives/runtime-interface/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml index 5bf47afd78..99baf624a5 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml +++ b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test-wasm/Cargo.toml b/primitives/runtime-interface/test-wasm/Cargo.toml index 5029d4fa3e..ce236ae16c 100644 --- a/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/primitives/runtime-interface/test-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-dev", default-features = false, path = "../" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index 3aab396e2e..efd474dc93 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-dev", path = "../" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sp-runtime-interface-test-wasm = { version = "2.0.0-dev", path = "../test-wasm" } -sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-dev", path = "../test-wasm-deprecated" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-core = { version = "2.0.0-dev", path = "../../core" } -sp-io = { version = "2.0.0-dev", path = "../../io" } +sp-runtime-interface = { version = "2.0.0-rc1", path = "../" } +sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } +sp-runtime-interface-test-wasm = { version = "2.0.0-rc1", path = "../test-wasm" } +sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-rc1", path = "../test-wasm-deprecated" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } +sp-core = { version = "2.0.0-rc1", path = "../../core" } +sp-io = { version = "2.0.0-rc1", path = "../../io" } tracing = "0.1.13" diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index cc87a21f97..3c5fdde12b 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,23 +16,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } -sp-arithmetic = { version = "2.0.0-dev", default-features = false, path = "../arithmetic" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../io" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } +sp-arithmetic = { version = "2.0.0-rc1", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../io" } log = { version = "0.4.8", optional = true } paste = "0.1.6" rand = { version = "0.7.2", optional = true } impl-trait-for-tuples = "0.1.3" -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } hash256-std-hasher = { version = "0.15.2", default-features = false } [dev-dependencies] serde_json = "1.0.41" rand = "0.7.2" -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } [features] bench = [] diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index 73755d17c3..d5e3113511 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-sandbox" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,10 +13,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-dev", default-features = false, path = "../io" } -sp-wasm-interface = { version = "2.0.0-dev", default-features = false, path = "../wasm-interface" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../io" } +sp-wasm-interface = { version = "2.0.0-rc1", default-features = false, path = "../wasm-interface" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [dev-dependencies] diff --git a/primitives/serializer/Cargo.toml b/primitives/serializer/Cargo.toml index ded058caa1..ad57cdda4b 100644 --- a/primitives/serializer/Cargo.toml +++ b/primitives/serializer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-serializer" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index f910d85440..656db4ec92 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-session" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-staking = { version = "2.0.0-dev", default-features = false, path = "../staking" } -sp-runtime = { version = "2.0.0-dev", optional = true, path = "../runtime" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../staking" } +sp-runtime = { version = "2.0.0-rc1", optional = true, path = "../runtime" } [features] default = [ "std" ] diff --git a/primitives/staking/Cargo.toml b/primitives/staking/Cargo.toml index f22e88855d..75fbb0020c 100644 --- a/primitives/staking/Cargo.toml +++ b/primitives/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-staking" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index 470ad33fc3..b8ce048b2e 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-state-machine" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" @@ -18,17 +18,17 @@ parking_lot = "0.10.0" hash-db = "0.15.2" trie-db = "0.20.1" trie-root = "0.16.0" -sp-trie = { version = "2.0.0-dev", path = "../trie" } -sp-core = { version = "2.0.0-dev", path = "../core" } -sp-panic-handler = { version = "2.0.0-dev", path = "../panic-handler" } +sp-trie = { version = "2.0.0-rc1", path = "../trie" } +sp-core = { version = "2.0.0-rc1", path = "../core" } +sp-panic-handler = { version = "2.0.0-rc1", path = "../panic-handler" } codec = { package = "parity-scale-codec", version = "1.3.0" } num-traits = "0.2.8" rand = "0.7.2" -sp-externalities = { version = "0.8.0-dev", path = "../externalities" } +sp-externalities = { version = "0.8.0-rc1", path = "../externalities" } [dev-dependencies] hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } [features] default = [] diff --git a/primitives/std/Cargo.toml b/primitives/std/Cargo.toml index 8f9d626e25..d7ed5615ae 100644 --- a/primitives/std/Cargo.toml +++ b/primitives/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-std" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/storage/Cargo.toml b/primitives/storage/Cargo.toml index a2ac2b1308..94db0a4f4d 100644 --- a/primitives/storage/Cargo.toml +++ b/primitives/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-storage" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" description = "Storage related primitives" @@ -13,11 +13,11 @@ documentation = "https://docs.rs/sp-storage/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } impl-serde = { version = "0.2.3", optional = true } ref-cast = "1.0.0" -sp-debug-derive = { version = "2.0.0-dev", path = "../debug-derive" } +sp-debug-derive = { version = "2.0.0-rc1", path = "../debug-derive" } [features] default = [ "std" ] diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index b6d4972dd9..707b049533 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-test-primitives" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } [features] diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 4279538c24..570c878f7d 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-timestamp" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Substrate core types and inherents for timestamps." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } impl-trait-for-tuples = "0.1.3" wasm-timer = { version = "0.2", optional = true } diff --git a/primitives/tracing/Cargo.toml b/primitives/tracing/Cargo.toml index 2bdf76bc06..13c5d1c25c 100644 --- a/primitives/tracing/Cargo.toml +++ b/primitives/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-tracing" -version = "2.0.0-dev" +version = "2.0.0-rc1" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/primitives/transaction-pool/Cargo.toml b/primitives/transaction-pool/Cargo.toml index 5acb86ade4..312fb71353 100644 --- a/primitives/transaction-pool/Cargo.toml +++ b/primitives/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,9 +19,9 @@ derive_more = { version = "0.99.2", optional = true } futures = { version = "0.3.1", optional = true } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", features = ["derive"], optional = true} -sp-api = { version = "2.0.0-dev", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } -sp-utils = { version = "2.0.0-dev", default-features = false, path = "../utils" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-utils = { version = "2.0.0-rc1", default-features = false, path = "../utils" } [features] default = [ "std" ] diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index b3cf58ec59..8eacd4a628 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-trie" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/substrate/" @@ -18,19 +18,19 @@ harness = false [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } trie-db = { version = "0.20.1", default-features = false } trie-root = { version = "0.16.0", default-features = false } memory-db = { version = "0.20.0", default-features = false } -sp-core = { version = "2.0.0-dev", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } [dev-dependencies] trie-bench = "0.21.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-dev", path = "../runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } [features] default = ["std"] diff --git a/primitives/utils/Cargo.toml b/primitives/utils/Cargo.toml index 7ed50c9f32..6c5488f389 100644 --- a/primitives/utils/Cargo.toml +++ b/primitives/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-utils" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index dc9f562ccd..19a773d306 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-version" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] impl-serde = { version = "0.2.3", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index d9d17b9edb..d83a586827 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-wasm-interface" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } impl-trait-for-tuples = "0.1.2" -sp-std = { version = "2.0.0-dev", path = "../std", default-features = false } +sp-std = { version = "2.0.0-rc1", path = "../std", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index e19592a82b..4f6a46e145 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-utils" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index 082d9941d8..ae0dfb3808 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-client" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,17 +12,17 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../client/api" } -sc-client-db = { version = "0.8.0-dev", features = ["test-helpers"], path = "../../client/db" } -sp-consensus = { version = "0.8.0-dev", path = "../../primitives/consensus/common" } -sc-executor = { version = "0.8.0-dev", path = "../../client/executor" } -sc-consensus = { version = "0.8.0-dev", path = "../../client/consensus/common" } -sc-service = { version = "0.8.0-dev", default-features = false, features = ["test-helpers"], path = "../../client/service" } +sc-client-api = { version = "2.0.0-rc1", path = "../../client/api" } +sc-client-db = { version = "0.8.0-rc1", features = ["test-helpers"], path = "../../client/db" } +sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sc-executor = { version = "0.8.0-rc1", path = "../../client/executor" } +sc-consensus = { version = "0.8.0-rc1", path = "../../client/consensus/common" } +sc-service = { version = "0.8.0-rc1", default-features = false, features = ["test-helpers"], path = "../../client/service" } futures = "0.3.4" hash-db = "0.15.2" -sp-keyring = { version = "2.0.0-dev", path = "../../primitives/keyring" } +sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-core = { version = "2.0.0-dev", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-dev", path = "../../primitives/runtime" } -sp-blockchain = { version = "2.0.0-dev", path = "../../primitives/blockchain" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 6cd82ce029..70e98b2466 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,35 +13,35 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-dev", default-features = false, path = "../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/aura" } -sp-consensus-babe = { version = "0.8.0-dev", default-features = false, path = "../../primitives/consensus/babe" } -sp-block-builder = { version = "2.0.0-dev", default-features = false, path = "../../primitives/block-builder" } +sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/aura" } +sp-consensus-babe = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/babe" } +sp-block-builder = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-executive = { version = "2.0.0-dev", default-features = false, path = "../../frame/executive" } -sp-inherents = { version = "2.0.0-dev", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-dev", optional = true, path = "../../primitives/keyring" } +frame-executive = { version = "2.0.0-rc1", default-features = false, path = "../../frame/executive" } +sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-rc1", optional = true, path = "../../primitives/keyring" } memory-db = { version = "0.20.0", default-features = false } -sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-dev"} -sp-core = { version = "2.0.0-dev", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-dev", default-features = false, path = "../../primitives/std" } -sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-dev"} -sp-io = { version = "2.0.0-dev", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-dev", default-features = false, path = "../../frame/support" } -sp-version = { version = "2.0.0-dev", default-features = false, path = "../../primitives/version" } -sp-session = { version = "2.0.0-dev", default-features = false, path = "../../primitives/session" } -sp-api = { version = "2.0.0-dev", default-features = false, path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-dev", default-features = false, path = "../../primitives/runtime" } -pallet-babe = { version = "2.0.0-dev", default-features = false, path = "../../frame/babe" } -frame-system = { version = "2.0.0-dev", default-features = false, path = "../../frame/system" } -frame-system-rpc-runtime-api = { version = "2.0.0-dev", default-features = false, path = "../../frame/system/rpc/runtime-api" } -pallet-timestamp = { version = "2.0.0-dev", default-features = false, path = "../../frame/timestamp" } -sp-finality-grandpa = { version = "2.0.0-dev", default-features = false, path = "../../primitives/finality-grandpa" } -sp-trie = { version = "2.0.0-dev", default-features = false, path = "../../primitives/trie" } -sp-transaction-pool = { version = "2.0.0-dev", default-features = false, path = "../../primitives/transaction-pool" } +sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-rc1"} +sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-rc1"} +sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../frame/support" } +sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/version" } +sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/session" } +sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +pallet-babe = { version = "2.0.0-rc1", default-features = false, path = "../../frame/babe" } +frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../frame/system" } +frame-system-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "../../frame/system/rpc/runtime-api" } +pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../frame/timestamp" } +sp-finality-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/finality-grandpa" } +sp-trie = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/trie" } +sp-transaction-pool = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/transaction-pool" } trie-db = { version = "0.20.1", default-features = false } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } -sc-service = { version = "0.8.0-dev", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } +sc-service = { version = "0.8.0-rc1", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } # 3rd party cfg-if = "0.1.10" @@ -49,10 +49,10 @@ log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } [dev-dependencies] -sc-block-builder = { version = "0.8.0-dev", path = "../../client/block-builder" } -sc-executor = { version = "0.8.0-dev", path = "../../client/executor" } -substrate-test-runtime-client = { version = "2.0.0-dev", path = "./client" } -sp-state-machine = { version = "0.8.0-dev", path = "../../primitives/state-machine" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../client/block-builder" } +sc-executor = { version = "0.8.0-rc1", path = "../../client/executor" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "./client" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../utils/wasm-builder-runner" } diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index 32091a8e00..388a5e159b 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-client" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,16 +12,16 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-consensus = { version = "0.8.0-dev", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-dev", path = "../../../client/block-builder" } -substrate-test-client = { version = "2.0.0-dev", path = "../../client" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -substrate-test-runtime = { version = "2.0.0-dev", path = "../../runtime" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } +substrate-test-client = { version = "2.0.0-rc1", path = "../../client" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +substrate-test-runtime = { version = "2.0.0-rc1", path = "../../runtime" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-dev", path = "../../../client/api" } -sc-consensus = { version = "0.8.0-dev", path = "../../../client/consensus/common" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } +sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } futures = "0.3.4" diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml index 3184527308..a240984883 100644 --- a/test-utils/runtime/transaction-pool/Cargo.toml +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../client" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../client" } parking_lot = "0.10.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../primitives/transaction-pool" } -sc-transaction-graph = { version = "2.0.0-dev", path = "../../../client/transaction-pool/graph" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } +sc-transaction-graph = { version = "2.0.0-rc1", path = "../../../client/transaction-pool/graph" } futures = { version = "0.3.1", features = ["compat"] } derive_more = "0.99.2" diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index ca69206ce3..6b15cf4346 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-browser-utils" -version = "0.8.0-dev" +version = "0.8.0-rc1" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" @@ -22,11 +22,11 @@ js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" kvdb-web = "0.6" -sp-database = { version = "2.0.0-dev", path = "../../primitives/database" } -sc-informant = { version = "0.8.0-dev", path = "../../client/informant" } -sc-service = { version = "0.8.0-dev", path = "../../client/service", default-features = false } -sc-network = { path = "../../client/network", version = "0.8.0-dev"} -sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-dev"} +sp-database = { version = "2.0.0-rc1", path = "../../primitives/database" } +sc-informant = { version = "0.8.0-rc1", path = "../../client/informant" } +sc-service = { version = "0.8.0-rc1", path = "../../client/service", default-features = false } +sc-network = { path = "../../client/network", version = "0.8.0-rc1"} +sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-rc1"} # Imported just for the `no_cc` feature clear_on_drop = { version = "0.2.3", features = ["no_cc"] } diff --git a/utils/build-script-utils/Cargo.toml b/utils/build-script-utils/Cargo.toml index 72374a531c..02a5e13c88 100644 --- a/utils/build-script-utils/Cargo.toml +++ b/utils/build-script-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-build-script-utils" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/fork-tree/Cargo.toml b/utils/fork-tree/Cargo.toml index 7062a61ae5..357016cd2a 100644 --- a/utils/fork-tree/Cargo.toml +++ b/utils/fork-tree/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fork-tree" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/frame/benchmarking-cli/Cargo.toml b/utils/frame/benchmarking-cli/Cargo.toml index fc681bd044..7a0be9ec55 100644 --- a/utils/frame/benchmarking-cli/Cargo.toml +++ b/utils/frame/benchmarking-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking-cli" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,15 +12,15 @@ description = "CLI for benchmarking FRAME" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-benchmarking = { version = "2.0.0-dev", path = "../../../frame/benchmarking" } -sp-core = { version = "2.0.0-dev", path = "../../../primitives/core" } -sc-service = { version = "0.8.0-dev", default-features = false, path = "../../../client/service" } -sc-cli = { version = "0.8.0-dev", path = "../../../client/cli" } -sc-client-db = { version = "0.8.0-dev", path = "../../../client/db" } -sc-executor = { version = "0.8.0-dev", path = "../../../client/executor" } -sp-externalities = { version = "0.8.0-dev", path = "../../../primitives/externalities" } -sp-runtime = { version = "2.0.0-dev", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-dev", path = "../../../primitives/state-machine" } +frame-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/benchmarking" } +sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } +sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } +sc-client-db = { version = "0.8.0-rc1", path = "../../../client/db" } +sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } +sp-externalities = { version = "0.8.0-rc1", path = "../../../primitives/externalities" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } structopt = "0.3.8" codec = { version = "1.3.0", package = "parity-scale-codec" } diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index b086f6aa5f..14cf65742e 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-support" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies ", "Andrew Dirksen "] edition = "2018" license = "Apache-2.0" @@ -17,10 +17,10 @@ jsonrpc-client-transports = { version = "14.0.5", default-features = false, feat jsonrpc-core = "14" codec = { package = "parity-scale-codec", version = "1" } serde = "1" -frame-support = { version = "2.0.0-dev", path = "../../../../frame/support" } -sp-storage = { version = "2.0.0-dev", path = "../../../../primitives/storage" } -sc-rpc-api = { version = "0.8.0-dev", path = "../../../../client/rpc-api" } +frame-support = { version = "2.0.0-rc1", path = "../../../../frame/support" } +sp-storage = { version = "2.0.0-rc1", path = "../../../../primitives/storage" } +sc-rpc-api = { version = "0.8.0-rc1", path = "../../../../client/rpc-api" } [dev-dependencies] -frame-system = { version = "2.0.0-dev", path = "../../../../frame/system" } +frame-system = { version = "2.0.0-rc1", path = "../../../../frame/system" } tokio = "0.2" diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index 33fd3b399a..ed00809a3b 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-system" -version = "2.0.0-dev" +version = "2.0.0-rc1" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "FRAME's system exposed over Substrate RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-dev", path = "../../../../client/api" } +sc-client-api = { version = "2.0.0-rc1", path = "../../../../client/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.4", features = ["compat"] } jsonrpc-core = "14.0.3" @@ -20,14 +20,14 @@ jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" log = "0.4.8" serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-dev", path = "../../../../primitives/runtime" } -sp-api = { version = "2.0.0-dev", path = "../../../../primitives/api" } -frame-system-rpc-runtime-api = { version = "2.0.0-dev", path = "../../../../frame/system/rpc/runtime-api" } -sp-core = { version = "2.0.0-dev", path = "../../../../primitives/core" } -sp-blockchain = { version = "2.0.0-dev", path = "../../../../primitives/blockchain" } -sp-transaction-pool = { version = "2.0.0-dev", path = "../../../../primitives/transaction-pool" } +sp-runtime = { version = "2.0.0-rc1", path = "../../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc1", path = "../../../../primitives/api" } +frame-system-rpc-runtime-api = { version = "2.0.0-rc1", path = "../../../../frame/system/rpc/runtime-api" } +sp-core = { version = "2.0.0-rc1", path = "../../../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc1", path = "../../../../primitives/blockchain" } +sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../../primitives/transaction-pool" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-dev", path = "../../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../../test-utils/runtime/client" } env_logger = "0.7.0" -sc-transaction-pool = { version = "2.0.0-dev", path = "../../../../client/transaction-pool" } +sc-transaction-pool = { version = "2.0.0-rc1", path = "../../../../client/transaction-pool" } diff --git a/utils/prometheus/Cargo.toml b/utils/prometheus/Cargo.toml index 9ecf5325cd..697e186db6 100644 --- a/utils/prometheus/Cargo.toml +++ b/utils/prometheus/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Endpoint to expose Prometheus metrics" name = "substrate-prometheus-endpoint" -version = "0.8.0-dev" +version = "0.8.0-rc1" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" -- GitLab From 597622e2c0203d1327de34d2803a00429e7ed355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 25 May 2020 18:37:53 +0200 Subject: [PATCH 118/150] Make sure fixed arithmetic tests don't rely on debug assertions (#6126) --- primitives/arithmetic/src/fixed.rs | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/primitives/arithmetic/src/fixed.rs b/primitives/arithmetic/src/fixed.rs index 19f498593d..5c87891432 100644 --- a/primitives/arithmetic/src/fixed.rs +++ b/primitives/arithmetic/src/fixed.rs @@ -659,13 +659,6 @@ macro_rules! implement_fixed { assert_eq!(to_bound::<_, _, u32>(a, b), 0); } - #[test] - #[should_panic(expected = "attempt to negate with overflow")] - fn op_neg_panics() { - let a = $name::min_value(); - let _ = -a; - } - #[test] fn op_neg_works() { let a = $name::saturating_from_integer(5); @@ -700,11 +693,10 @@ macro_rules! implement_fixed { } #[test] - #[should_panic(expected = "attempt to add with overflow")] - fn op_add_panics() { + fn op_checked_add_overflow_works() { let a = $name::max_value(); let b = 1.into(); - let _ = a + b; + assert!(a.checked_add(&b).is_none()); } #[test] @@ -722,11 +714,10 @@ macro_rules! implement_fixed { } #[test] - #[should_panic(expected = "attempt to subtract with overflow")] - fn op_sub_panics() { + fn op_checked_sub_underflow_works() { let a = $name::min_value(); let b = 1.into(); - let _c = a - b; + assert!(a.checked_sub(&b).is_none()); } #[test] @@ -744,11 +735,10 @@ macro_rules! implement_fixed { } #[test] - #[should_panic(expected = "attempt to multiply with overflow")] - fn op_mul_panics() { + fn op_checked_mul_overflow_works() { let a = $name::max_value(); let b = 2.into(); - let _c = a * b; + assert!(a.checked_mul(&b).is_none()); } #[test] @@ -771,11 +761,10 @@ macro_rules! implement_fixed { } #[test] - #[should_panic(expected = "attempt to divide with overflow")] - fn op_div_panics_on_overflow() { + fn op_checked_div_overflow_works() { let a = $name::min_value(); let b = (-1).into(); - let _c = a / b; + assert!(a.checked_div(&b).is_none()); } #[test] -- GitLab From 3dedc031d6d6e6316f2e39b81bf0ddb5f282d7fd Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Mon, 25 May 2020 21:09:39 +0200 Subject: [PATCH 119/150] Add Changelog for rc1 (#6128) --- docs/CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 84c469386a..76fb1ac579 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,6 +6,22 @@ The format is based on [Keep a Changelog]. ## Unreleased + +## 2.0.0-alpha.8 -> 2.0.0-rc1 + +Runtime +------- + +* Allow operational recovery path if on_initialize use fullblock. (#6089) +* Maximum extrinsic weight limit (#6067) + +Client +------ + +* Add JSON format to import blocks and set it as default (#5816) +* Upgrade to libp2p v0.19 - Changes the default PeerId representation (#6064) + + ## 2.0.0-alpha.7 -> 2.0.0-alpha.8 **License Changed** -- GitLab From ffcce8538f08ad64656ac5eb8da783dce1a79eae Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Tue, 26 May 2020 06:34:25 +0200 Subject: [PATCH 120/150] Filter calls in utility (#6131) * Filter calls. * Remove old proxy code * Docs and repot * Update frame/utility/src/tests.rs Co-authored-by: Marcio Diaz * fix test * Grumble * Bump runtime version * fix * Attempt general fix Co-authored-by: Marcio Diaz Co-authored-by: NikVolf --- bin/node/cli/tests/build_spec_works.rs | 2 +- bin/node/cli/tests/check_block_works.rs | 2 +- bin/node/cli/tests/common.rs | 2 +- bin/node/cli/tests/export_import_flow.rs | 8 ++-- bin/node/cli/tests/inspect_works.rs | 2 +- bin/node/cli/tests/purge_chain_works.rs | 2 +- .../tests/running_the_node_and_interrupt.rs | 2 +- bin/node/runtime/src/lib.rs | 5 ++- frame/support/src/traits.rs | 10 +++++ frame/utility/src/lib.rs | 29 +++++++++--- frame/utility/src/tests.rs | 45 +++++++++++++++++++ 11 files changed, 92 insertions(+), 17 deletions(-) diff --git a/bin/node/cli/tests/build_spec_works.rs b/bin/node/cli/tests/build_spec_works.rs index d4f6de3b87..800a4a8c51 100644 --- a/bin/node/cli/tests/build_spec_works.rs +++ b/bin/node/cli/tests/build_spec_works.rs @@ -25,7 +25,7 @@ fn build_spec_works() { let base_path = tempdir().expect("could not create a temp dir"); let output = Command::new(cargo_bin("substrate")) - .args(&["build-spec", "--rc1", "-d"]) + .args(&["build-spec", "--dev", "-d"]) .arg(base_path.path()) .output() .unwrap(); diff --git a/bin/node/cli/tests/check_block_works.rs b/bin/node/cli/tests/check_block_works.rs index 744effeef1..34078b08cf 100644 --- a/bin/node/cli/tests/check_block_works.rs +++ b/bin/node/cli/tests/check_block_works.rs @@ -31,7 +31,7 @@ fn check_block_works() { common::run_dev_node_for_a_while(base_path.path()); let status = Command::new(cargo_bin("substrate")) - .args(&["check-block", "--rc1", "--pruning", "archive", "-d"]) + .args(&["check-block", "--dev", "--pruning", "archive", "-d"]) .arg(base_path.path()) .arg("1") .status() diff --git a/bin/node/cli/tests/common.rs b/bin/node/cli/tests/common.rs index 6f2714988f..61a07dd1ca 100644 --- a/bin/node/cli/tests/common.rs +++ b/bin/node/cli/tests/common.rs @@ -51,7 +51,7 @@ pub fn run_dev_node_for_a_while(base_path: &Path) { let mut cmd = Command::new(cargo_bin("substrate")); let mut cmd = cmd - .args(&["--rc1"]) + .args(&["--dev"]) .arg("-d") .arg(base_path) .spawn() diff --git a/bin/node/cli/tests/export_import_flow.rs b/bin/node/cli/tests/export_import_flow.rs index a37dc6e88a..557e722ddb 100644 --- a/bin/node/cli/tests/export_import_flow.rs +++ b/bin/node/cli/tests/export_import_flow.rs @@ -82,8 +82,8 @@ impl<'a> ExportImportRevertExecutor<'a> { let sub_command_str = sub_command.to_string(); // Adding "--binary" if need be. let arguments: Vec<&str> = match format_opt { - FormatOpt::Binary => vec![&sub_command_str, "--rc1", "--pruning", "archive", "--binary", "-d"], - FormatOpt::Json => vec![&sub_command_str, "--rc1", "--pruning", "archive", "-d"], + FormatOpt::Binary => vec![&sub_command_str, "--dev", "--pruning", "archive", "--binary", "-d"], + FormatOpt::Json => vec![&sub_command_str, "--dev", "--pruning", "archive", "-d"], }; let tmp: TempDir; @@ -136,7 +136,7 @@ impl<'a> ExportImportRevertExecutor<'a> { let _ = fs::remove_dir_all(&self.db_path); } - /// Runs the `import-blocks` command, asserting that an error was found or + /// Runs the `import-blocks` command, asserting that an error was found or /// not depending on `expected_to_fail`. fn run_import(&mut self, fmt_opt: FormatOpt, expected_to_fail: bool) { let log = self.run_block_command(SubCommand::ImportBlocks, fmt_opt, expected_to_fail); @@ -166,7 +166,7 @@ impl<'a> ExportImportRevertExecutor<'a> { /// Runs the `revert` command. fn run_revert(&self) { let output = Command::new(cargo_bin("substrate")) - .args(&["revert", "--rc1", "--pruning", "archive", "-d"]) + .args(&["revert", "--dev", "--pruning", "archive", "-d"]) .arg(&self.base_path.path()) .output() .unwrap(); diff --git a/bin/node/cli/tests/inspect_works.rs b/bin/node/cli/tests/inspect_works.rs index fd23bb6399..aa9653acad 100644 --- a/bin/node/cli/tests/inspect_works.rs +++ b/bin/node/cli/tests/inspect_works.rs @@ -31,7 +31,7 @@ fn inspect_works() { common::run_dev_node_for_a_while(base_path.path()); let status = Command::new(cargo_bin("substrate")) - .args(&["inspect", "--rc1", "--pruning", "archive", "-d"]) + .args(&["inspect", "--dev", "--pruning", "archive", "-d"]) .arg(base_path.path()) .args(&["block", "1"]) .status() diff --git a/bin/node/cli/tests/purge_chain_works.rs b/bin/node/cli/tests/purge_chain_works.rs index 67a4649a6f..001bed8b13 100644 --- a/bin/node/cli/tests/purge_chain_works.rs +++ b/bin/node/cli/tests/purge_chain_works.rs @@ -30,7 +30,7 @@ fn purge_chain_works() { common::run_dev_node_for_a_while(base_path.path()); let status = Command::new(cargo_bin("substrate")) - .args(&["purge-chain", "--rc1", "-d"]) + .args(&["purge-chain", "--dev", "-d"]) .arg(base_path.path()) .arg("-y") .status() diff --git a/bin/node/cli/tests/running_the_node_and_interrupt.rs b/bin/node/cli/tests/running_the_node_and_interrupt.rs index efd9f14762..bd79dcd77a 100644 --- a/bin/node/cli/tests/running_the_node_and_interrupt.rs +++ b/bin/node/cli/tests/running_the_node_and_interrupt.rs @@ -31,7 +31,7 @@ fn running_the_node_works_and_can_be_interrupted() { fn run_command_and_kill(signal: Signal) { let base_path = tempdir().expect("could not create a temp dir"); let mut cmd = Command::new(cargo_bin("substrate")) - .args(&["--rc1", "-d"]) + .args(&["--dev", "-d"]) .arg(base_path.path()) .spawn() .unwrap(); diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 6a02ad66cd..67e988f496 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -93,8 +93,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to 0. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 250, - impl_version: 2, + spec_version: 251, + impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; @@ -179,6 +179,7 @@ impl pallet_utility::Trait for Runtime { type MultisigDepositBase = MultisigDepositBase; type MultisigDepositFactor = MultisigDepositFactor; type MaxSignatories = MaxSignatories; + type IsCallable = (); } parameter_types! { diff --git a/frame/support/src/traits.rs b/frame/support/src/traits.rs index 99a5abcbac..0b48ac7f41 100644 --- a/frame/support/src/traits.rs +++ b/frame/support/src/traits.rs @@ -33,6 +33,16 @@ use crate::storage::StorageMap; use crate::weights::Weight; use impl_trait_for_tuples::impl_for_tuples; +/// Simple trait for providing a filter over a reference to some type. +pub trait Filter { + /// Determine if a given value should be allowed through the filter (returns `true`) or not. + fn filter(_: &T) -> bool; +} + +impl Filter for () { + fn filter(_: &T) -> bool { true } +} + /// An abstraction of a value stored within storage, but possibly as part of a larger composite /// item. pub trait StoredMap { diff --git a/frame/utility/src/lib.rs b/frame/utility/src/lib.rs index 6692848609..546af51bdd 100644 --- a/frame/utility/src/lib.rs +++ b/frame/utility/src/lib.rs @@ -67,11 +67,11 @@ use codec::{Encode, Decode}; use sp_core::TypeId; use sp_io::hashing::blake2_256; use frame_support::{decl_module, decl_event, decl_error, decl_storage, Parameter, ensure, RuntimeDebug}; -use frame_support::{traits::{Get, ReservableCurrency, Currency}, +use frame_support::{traits::{Get, ReservableCurrency, Currency, Filter}, weights::{Weight, GetDispatchInfo, DispatchClass, FunctionOf, Pays}, dispatch::{DispatchResultWithPostInfo, DispatchErrorWithPostInfo, PostDispatchInfo}, }; -use frame_system::{self as system, ensure_signed}; +use frame_system::{self as system, ensure_signed, ensure_root}; use sp_runtime::{DispatchError, DispatchResult, traits::Dispatchable}; mod tests; @@ -85,7 +85,8 @@ pub trait Trait: frame_system::Trait { type Event: From> + Into<::Event>; /// The overarching call type. - type Call: Parameter + Dispatchable + GetDispatchInfo + From>; + type Call: Parameter + Dispatchable + + GetDispatchInfo + From>; /// The currency mechanism. type Currency: ReservableCurrency; @@ -103,6 +104,9 @@ pub trait Trait: frame_system::Trait { /// The maximum amount of signatories allowed in the multisig. type MaxSignatories: Get; + + /// Is a given call compatible with the proxying subsystem? + type IsCallable: Filter<::Call>; } /// A global extrinsic index, formed as the extrinsic index within a block, together with that @@ -164,6 +168,8 @@ decl_error! { WrongTimepoint, /// A timepoint was given, yet no multisig operation is underway. UnexpectedTimepoint, + /// A call with a `false` IsCallable filter was attempted. + Uncallable, } } @@ -191,6 +197,8 @@ decl_event! { /// A multisig operation has been cancelled. First param is the account that is /// cancelling, third is the multisig account, fourth is hash of the call. MultisigCancelled(AccountId, Timepoint, AccountId, CallHash), + /// A call with a `false` IsCallable filter was attempted. + Uncallable(u32), } } @@ -230,7 +238,8 @@ decl_module! { /// Send a batch of dispatch calls. /// - /// This will execute until the first one fails and then stop. + /// This will execute until the first one fails and then stop. Calls must fulfil the + /// `IsCallable` filter unless the origin is `Root`. /// /// May be called from any origin. /// @@ -266,7 +275,12 @@ decl_module! { Pays::Yes, )] fn batch(origin, calls: Vec<::Call>) { + let is_root = ensure_root(origin.clone()).is_ok(); for (index, call) in calls.into_iter().enumerate() { + if !is_root && !T::IsCallable::filter(&call) { + Self::deposit_event(Event::::Uncallable(index as u32)); + return Ok(()) + } let result = call.dispatch(origin.clone()); if let Err(e) = result { Self::deposit_event(Event::::BatchInterrupted(index as u32, e.error)); @@ -278,6 +292,8 @@ decl_module! { /// Send a call through an indexed pseudonym of the sender. /// + /// Calls must each fulfil the `IsCallable` filter. + /// /// The dispatch origin for this call must be _Signed_. /// /// # @@ -293,6 +309,7 @@ decl_module! { )] fn as_sub(origin, index: u16, call: Box<::Call>) -> DispatchResult { let who = ensure_signed(origin)?; + ensure!(T::IsCallable::filter(&call), Error::::Uncallable); let pseudonym = Self::sub_account_id(who, index); call.dispatch(frame_system::RawOrigin::Signed(pseudonym).into()) .map(|_| ()).map_err(|e| e.error) @@ -301,7 +318,8 @@ decl_module! { /// Register approval for a dispatch to be made from a deterministic composite account if /// approved by a total of `threshold - 1` of `other_signatories`. /// - /// If there are enough, then dispatch the call. + /// If there are enough, then dispatch the call. Calls must each fulfil the `IsCallable` + /// filter. /// /// Payment: `MultisigDepositBase` will be reserved if this is the first approval, plus /// `threshold` times `MultisigDepositFactor`. It is returned once this dispatch happens or @@ -364,6 +382,7 @@ decl_module! { call: Box<::Call>, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; + ensure!(T::IsCallable::filter(call.as_ref()), Error::::Uncallable); ensure!(threshold >= 1, Error::::ZeroThreshold); let max_sigs = T::MaxSignatories::get() as usize; ensure!(!other_signatories.is_empty(), Error::::TooFewSignatories); diff --git a/frame/utility/src/tests.rs b/frame/utility/src/tests.rs index da4d41e3b7..daf3d6c53a 100644 --- a/frame/utility/src/tests.rs +++ b/frame/utility/src/tests.rs @@ -99,6 +99,16 @@ parameter_types! { pub const MultisigDepositFactor: u64 = 1; pub const MaxSignatories: u16 = 3; } + +pub struct TestIsCallable; +impl Filter for TestIsCallable { + fn filter(c: &Call) -> bool { + match *c { + Call::Balances(pallet_balances::Call::transfer(..)) => true, + _ => false, + } + } +} impl Trait for Test { type Event = TestEvent; type Call = Call; @@ -106,6 +116,7 @@ impl Trait for Test { type MultisigDepositBase = MultisigDepositBase; type MultisigDepositFactor = MultisigDepositFactor; type MaxSignatories = MaxSignatories; + type IsCallable = TestIsCallable; } type System = frame_system::Module; type Balances = pallet_balances::Module; @@ -379,6 +390,17 @@ fn multisig_1_of_3_works() { }); } +#[test] +fn multisig_filters() { + new_test_ext().execute_with(|| { + let call = Box::new(Call::System(frame_system::Call::remark(vec![]))); + assert_noop!( + Utility::as_multi(Origin::signed(1), 1, vec![], None, call.clone()), + Error::::Uncallable, + ); + }); +} + #[test] fn as_sub_works() { new_test_ext().execute_with(|| { @@ -399,6 +421,17 @@ fn as_sub_works() { }); } +#[test] +fn as_sub_filters() { + new_test_ext().execute_with(|| { + assert_noop!(Utility::as_sub( + Origin::signed(1), + 1, + Box::new(Call::System(frame_system::Call::remark(vec![]))), + ), Error::::Uncallable); + }); +} + #[test] fn batch_with_root_works() { new_test_ext().execute_with(|| { @@ -429,6 +462,18 @@ fn batch_with_signed_works() { }); } +#[test] +fn batch_with_signed_filters() { + new_test_ext().execute_with(|| { + assert_ok!( + Utility::batch(Origin::signed(1), vec![ + Call::System(frame_system::Call::remark(vec![])) + ]), + ); + expect_event(RawEvent::Uncallable(0)); + }); +} + #[test] fn batch_early_exit_works() { new_test_ext().execute_with(|| { -- GitLab From 45b9f0a9cbf901abaa9f1fca5fe8baeed029133d Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Tue, 26 May 2020 14:32:23 +0200 Subject: [PATCH 121/150] Releasing rc2 (#6136) --- Cargo.lock | 356 +++++++++--------- bin/node-template/node/Cargo.toml | 40 +- bin/node-template/pallets/template/Cargo.toml | 12 +- bin/node-template/runtime/Cargo.toml | 48 +-- bin/node/bench/Cargo.toml | 20 +- bin/node/browser-testing/Cargo.toml | 6 +- bin/node/cli/Cargo.toml | 118 +++--- bin/node/executor/Cargo.toml | 50 +-- bin/node/inspect/Cargo.toml | 14 +- bin/node/primitives/Cargo.toml | 12 +- bin/node/rpc-client/Cargo.toml | 6 +- bin/node/rpc/Cargo.toml | 40 +- bin/node/runtime/Cargo.toml | 112 +++--- bin/node/testing/Cargo.toml | 68 ++-- bin/utils/chain-spec-builder/Cargo.toml | 10 +- bin/utils/subkey/Cargo.toml | 20 +- client/api/Cargo.toml | 44 +-- client/authority-discovery/Cargo.toml | 24 +- client/basic-authorship/Cargo.toml | 30 +- client/block-builder/Cargo.toml | 20 +- client/chain-spec/Cargo.toml | 14 +- client/chain-spec/derive/Cargo.toml | 2 +- client/cli/Cargo.toml | 32 +- client/consensus/aura/Cargo.toml | 50 +-- client/consensus/babe/Cargo.toml | 58 +-- client/consensus/babe/rpc/Cargo.toml | 30 +- client/consensus/common/Cargo.toml | 10 +- client/consensus/epochs/Cargo.toml | 10 +- client/consensus/manual-seal/Cargo.toml | 26 +- client/consensus/pow/Cargo.toml | 24 +- client/consensus/slots/Cargo.toml | 24 +- client/consensus/uncles/Cargo.toml | 14 +- client/db/Cargo.toml | 28 +- client/executor/Cargo.toml | 36 +- client/executor/common/Cargo.toml | 12 +- client/executor/runtime-test/Cargo.toml | 14 +- client/executor/wasmi/Cargo.toml | 12 +- client/executor/wasmtime/Cargo.toml | 12 +- client/finality-grandpa/Cargo.toml | 54 +-- client/finality-grandpa/rpc/Cargo.toml | 6 +- client/informant/Cargo.toml | 12 +- client/keystore/Cargo.toml | 6 +- client/network-gossip/Cargo.toml | 8 +- client/network/Cargo.toml | 32 +- client/network/test/Cargo.toml | 26 +- client/offchain/Cargo.toml | 26 +- client/peerset/Cargo.toml | 4 +- client/proposer-metrics/Cargo.toml | 4 +- client/rpc-api/Cargo.toml | 14 +- client/rpc-servers/Cargo.toml | 4 +- client/rpc/Cargo.toml | 44 +-- client/service/Cargo.toml | 68 ++-- client/service/test/Cargo.toml | 40 +- client/state-db/Cargo.toml | 6 +- client/telemetry/Cargo.toml | 2 +- client/tracing/Cargo.toml | 4 +- client/transaction-pool/Cargo.toml | 28 +- client/transaction-pool/graph/Cargo.toml | 14 +- docs/CHANGELOG.md | 3 + frame/assets/Cargo.toml | 14 +- frame/aura/Cargo.toml | 26 +- frame/authority-discovery/Cargo.toml | 22 +- frame/authorship/Cargo.toml | 18 +- frame/babe/Cargo.toml | 30 +- frame/balances/Cargo.toml | 18 +- frame/benchmark/Cargo.toml | 14 +- frame/benchmarking/Cargo.toml | 16 +- frame/collective/Cargo.toml | 18 +- frame/contracts/Cargo.toml | 26 +- frame/contracts/common/Cargo.toml | 6 +- frame/contracts/rpc/Cargo.toml | 16 +- frame/contracts/rpc/runtime-api/Cargo.toml | 10 +- frame/democracy/Cargo.toml | 24 +- frame/elections-phragmen/Cargo.toml | 22 +- frame/elections/Cargo.toml | 16 +- frame/evm/Cargo.toml | 18 +- frame/example-offchain-worker/Cargo.toml | 14 +- frame/example/Cargo.toml | 18 +- frame/executive/Cargo.toml | 26 +- frame/finality-tracker/Cargo.toml | 18 +- frame/generic-asset/Cargo.toml | 14 +- frame/grandpa/Cargo.toml | 38 +- frame/identity/Cargo.toml | 18 +- frame/im-online/Cargo.toml | 24 +- frame/indices/Cargo.toml | 18 +- frame/membership/Cargo.toml | 14 +- frame/metadata/Cargo.toml | 6 +- frame/nicks/Cargo.toml | 16 +- frame/offences/Cargo.toml | 18 +- frame/offences/benchmarking/Cargo.toml | 36 +- frame/randomness-collective-flip/Cargo.toml | 14 +- frame/recovery/Cargo.toml | 16 +- frame/scheduler/Cargo.toml | 16 +- frame/scored-pool/Cargo.toml | 16 +- frame/session/Cargo.toml | 24 +- frame/session/benchmarking/Cargo.toml | 26 +- frame/society/Cargo.toml | 16 +- frame/staking/Cargo.toml | 38 +- frame/staking/fuzzer/Cargo.lock | 2 +- frame/staking/fuzzer/Cargo.toml | 26 +- frame/staking/reward-curve/Cargo.toml | 4 +- frame/sudo/Cargo.toml | 14 +- frame/support/Cargo.toml | 24 +- frame/support/procedural/Cargo.toml | 4 +- frame/support/procedural/tools/Cargo.toml | 4 +- .../procedural/tools/derive/Cargo.toml | 2 +- frame/support/test/Cargo.toml | 14 +- frame/system/Cargo.toml | 18 +- frame/system/benchmarking/Cargo.toml | 16 +- frame/system/rpc/runtime-api/Cargo.toml | 4 +- frame/timestamp/Cargo.toml | 22 +- frame/transaction-payment/Cargo.toml | 20 +- frame/transaction-payment/rpc/Cargo.toml | 14 +- .../rpc/runtime-api/Cargo.toml | 10 +- frame/treasury/Cargo.toml | 18 +- frame/utility/Cargo.toml | 20 +- frame/vesting/Cargo.toml | 20 +- primitives/allocator/Cargo.toml | 8 +- primitives/api/Cargo.toml | 16 +- primitives/api/proc-macro/Cargo.toml | 2 +- primitives/api/test/Cargo.toml | 22 +- primitives/application-crypto/Cargo.toml | 8 +- primitives/application-crypto/test/Cargo.toml | 12 +- primitives/arithmetic/Cargo.toml | 6 +- primitives/arithmetic/fuzzer/Cargo.toml | 4 +- primitives/authority-discovery/Cargo.toml | 10 +- primitives/authorship/Cargo.toml | 8 +- primitives/block-builder/Cargo.toml | 10 +- primitives/blockchain/Cargo.toml | 10 +- primitives/chain-spec/Cargo.toml | 2 +- primitives/consensus/aura/Cargo.toml | 14 +- primitives/consensus/babe/Cargo.toml | 18 +- primitives/consensus/common/Cargo.toml | 20 +- primitives/consensus/pow/Cargo.toml | 10 +- primitives/consensus/vrf/Cargo.toml | 8 +- primitives/core/Cargo.toml | 14 +- primitives/database/Cargo.toml | 2 +- primitives/debug-derive/Cargo.toml | 2 +- primitives/externalities/Cargo.toml | 6 +- primitives/finality-grandpa/Cargo.toml | 12 +- primitives/finality-tracker/Cargo.toml | 6 +- primitives/inherents/Cargo.toml | 6 +- primitives/io/Cargo.toml | 16 +- primitives/keyring/Cargo.toml | 6 +- primitives/offchain/Cargo.toml | 10 +- primitives/panic-handler/Cargo.toml | 2 +- primitives/phragmen/Cargo.toml | 14 +- primitives/phragmen/compact/Cargo.toml | 2 +- primitives/phragmen/fuzzer/Cargo.lock | 2 +- primitives/phragmen/fuzzer/Cargo.toml | 6 +- primitives/rpc/Cargo.toml | 4 +- primitives/runtime-interface/Cargo.toml | 20 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../test-wasm-deprecated/Cargo.toml | 10 +- .../runtime-interface/test-wasm/Cargo.toml | 10 +- primitives/runtime-interface/test/Cargo.toml | 18 +- primitives/runtime/Cargo.toml | 16 +- primitives/sandbox/Cargo.toml | 10 +- primitives/serializer/Cargo.toml | 2 +- primitives/session/Cargo.toml | 12 +- primitives/staking/Cargo.toml | 6 +- primitives/state-machine/Cargo.toml | 12 +- primitives/std/Cargo.toml | 2 +- primitives/storage/Cargo.toml | 6 +- primitives/test-primitives/Cargo.toml | 8 +- primitives/timestamp/Cargo.toml | 10 +- primitives/tracing/Cargo.toml | 2 +- primitives/transaction-pool/Cargo.toml | 8 +- primitives/trie/Cargo.toml | 8 +- primitives/utils/Cargo.toml | 2 +- primitives/version/Cargo.toml | 6 +- primitives/wasm-interface/Cargo.toml | 4 +- test-utils/Cargo.toml | 2 +- test-utils/client/Cargo.toml | 24 +- test-utils/runtime/Cargo.toml | 60 +-- test-utils/runtime/client/Cargo.toml | 24 +- .../runtime/transaction-pool/Cargo.toml | 12 +- utils/browser/Cargo.toml | 12 +- utils/build-script-utils/Cargo.toml | 2 +- utils/fork-tree/Cargo.toml | 2 +- utils/frame/benchmarking-cli/Cargo.toml | 20 +- utils/frame/rpc/support/Cargo.toml | 10 +- utils/frame/rpc/system/Cargo.toml | 20 +- utils/prometheus/Cargo.toml | 2 +- 184 files changed, 1771 insertions(+), 1768 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f7decfec32..f3c9672e37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -574,7 +574,7 @@ dependencies = [ [[package]] name = "chain-spec-builder" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "ansi_term 0.12.1", "node-cli", @@ -1393,14 +1393,14 @@ checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" [[package]] name = "fork-tree" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", ] [[package]] name = "frame-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -1416,7 +1416,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "parity-scale-codec", @@ -1433,7 +1433,7 @@ dependencies = [ [[package]] name = "frame-executive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -1453,7 +1453,7 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "11.0.0-rc1" +version = "11.0.0-rc2" dependencies = [ "parity-scale-codec", "serde", @@ -1463,7 +1463,7 @@ dependencies = [ [[package]] name = "frame-support" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "bitmask", "frame-metadata", @@ -1489,7 +1489,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support-procedural-tools", "proc-macro2", @@ -1499,7 +1499,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate", @@ -1510,7 +1510,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -1519,7 +1519,7 @@ dependencies = [ [[package]] name = "frame-support-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "parity-scale-codec", @@ -1536,7 +1536,7 @@ dependencies = [ [[package]] name = "frame-system" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "criterion 0.2.11", "frame-support", @@ -1554,7 +1554,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -1569,7 +1569,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-api", @@ -3358,7 +3358,7 @@ dependencies = [ [[package]] name = "node-bench" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "fs_extra", @@ -3388,7 +3388,7 @@ dependencies = [ [[package]] name = "node-browser-testing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -3405,7 +3405,7 @@ dependencies = [ [[package]] name = "node-cli" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "assert_cmd", "frame-benchmarking-cli", @@ -3479,7 +3479,7 @@ dependencies = [ [[package]] name = "node-executor" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "criterion 0.3.1", "frame-benchmarking", @@ -3513,7 +3513,7 @@ dependencies = [ [[package]] name = "node-inspect" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "log", @@ -3529,7 +3529,7 @@ dependencies = [ [[package]] name = "node-primitives" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-system", "parity-scale-codec", @@ -3542,7 +3542,7 @@ dependencies = [ [[package]] name = "node-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "jsonrpc-core", "node-primitives", @@ -3568,7 +3568,7 @@ dependencies = [ [[package]] name = "node-rpc-client" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "env_logger 0.7.1", "futures 0.1.29", @@ -3581,7 +3581,7 @@ dependencies = [ [[package]] name = "node-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-executive", @@ -3647,7 +3647,7 @@ dependencies = [ [[package]] name = "node-template" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "log", @@ -3676,7 +3676,7 @@ dependencies = [ [[package]] name = "node-template-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-executive", "frame-support", @@ -3708,7 +3708,7 @@ dependencies = [ [[package]] name = "node-testing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "criterion 0.3.1", "frame-support", @@ -3911,7 +3911,7 @@ dependencies = [ [[package]] name = "pallet-assets" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -3925,7 +3925,7 @@ dependencies = [ [[package]] name = "pallet-aura" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -3947,7 +3947,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -3965,7 +3965,7 @@ dependencies = [ [[package]] name = "pallet-authorship" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -3981,7 +3981,7 @@ dependencies = [ [[package]] name = "pallet-babe" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4003,7 +4003,7 @@ dependencies = [ [[package]] name = "pallet-balances" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4019,7 +4019,7 @@ dependencies = [ [[package]] name = "pallet-benchmark" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4033,7 +4033,7 @@ dependencies = [ [[package]] name = "pallet-collective" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4050,7 +4050,7 @@ dependencies = [ [[package]] name = "pallet-contracts" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "assert_matches", "frame-support", @@ -4076,7 +4076,7 @@ dependencies = [ [[package]] name = "pallet-contracts-primitives" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -4085,7 +4085,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4104,7 +4104,7 @@ dependencies = [ [[package]] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "pallet-contracts-primitives", "parity-scale-codec", @@ -4115,7 +4115,7 @@ dependencies = [ [[package]] name = "pallet-democracy" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4135,7 +4135,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4151,7 +4151,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4170,7 +4170,7 @@ dependencies = [ [[package]] name = "pallet-evm" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "evm", "frame-support", @@ -4190,7 +4190,7 @@ dependencies = [ [[package]] name = "pallet-example" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4206,7 +4206,7 @@ dependencies = [ [[package]] name = "pallet-example-offchain-worker" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4221,7 +4221,7 @@ dependencies = [ [[package]] name = "pallet-finality-tracker" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4238,7 +4238,7 @@ dependencies = [ [[package]] name = "pallet-generic-asset" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4252,7 +4252,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "finality-grandpa", "frame-support", @@ -4279,7 +4279,7 @@ dependencies = [ [[package]] name = "pallet-identity" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -4296,7 +4296,7 @@ dependencies = [ [[package]] name = "pallet-im-online" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4315,7 +4315,7 @@ dependencies = [ [[package]] name = "pallet-indices" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4331,7 +4331,7 @@ dependencies = [ [[package]] name = "pallet-membership" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4345,7 +4345,7 @@ dependencies = [ [[package]] name = "pallet-nicks" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4360,7 +4360,7 @@ dependencies = [ [[package]] name = "pallet-offences" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4376,7 +4376,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4401,7 +4401,7 @@ dependencies = [ [[package]] name = "pallet-randomness-collective-flip" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4415,7 +4415,7 @@ dependencies = [ [[package]] name = "pallet-recovery" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "enumflags2", "frame-support", @@ -4431,7 +4431,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4446,7 +4446,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4461,7 +4461,7 @@ dependencies = [ [[package]] name = "pallet-session" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4482,7 +4482,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4502,7 +4502,7 @@ dependencies = [ [[package]] name = "pallet-society" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4518,7 +4518,7 @@ dependencies = [ [[package]] name = "pallet-staking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "env_logger 0.7.1", "frame-benchmarking", @@ -4569,7 +4569,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4580,7 +4580,7 @@ dependencies = [ [[package]] name = "pallet-sudo" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4594,7 +4594,7 @@ dependencies = [ [[package]] name = "pallet-template" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4606,7 +4606,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4624,7 +4624,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -4641,7 +4641,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "jsonrpc-core", "jsonrpc-core-client", @@ -4658,7 +4658,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "parity-scale-codec", @@ -4671,7 +4671,7 @@ dependencies = [ [[package]] name = "pallet-treasury" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4687,7 +4687,7 @@ dependencies = [ [[package]] name = "pallet-utility" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-benchmarking", "frame-support", @@ -4703,7 +4703,7 @@ dependencies = [ [[package]] name = "pallet-vesting" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "enumflags2", "frame-benchmarking", @@ -5827,7 +5827,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "bytes 0.5.4", "derive_more", @@ -5857,7 +5857,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -5883,7 +5883,7 @@ dependencies = [ [[package]] name = "sc-block-builder" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "parity-scale-codec", "sc-client-api", @@ -5900,7 +5900,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "impl-trait-for-tuples", "sc-chain-spec-derive", @@ -5915,7 +5915,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -5925,7 +5925,7 @@ dependencies = [ [[package]] name = "sc-cli" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "ansi_term 0.12.1", "atty", @@ -5966,7 +5966,7 @@ dependencies = [ [[package]] name = "sc-client-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "fnv", @@ -6004,7 +6004,7 @@ dependencies = [ [[package]] name = "sc-client-db" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "blake2-rfc", "env_logger 0.7.1", @@ -6037,7 +6037,7 @@ dependencies = [ [[package]] name = "sc-consensus" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "sc-client-api", "sp-blockchain", @@ -6047,7 +6047,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "env_logger 0.7.1", @@ -6085,7 +6085,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "env_logger 0.7.1", @@ -6135,7 +6135,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "futures 0.3.4", @@ -6163,7 +6163,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "fork-tree", "parity-scale-codec", @@ -6175,7 +6175,7 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "assert_matches", "derive_more", @@ -6205,7 +6205,7 @@ dependencies = [ [[package]] name = "sc-consensus-pow" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "futures 0.3.4", @@ -6226,7 +6226,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "futures 0.3.4", "futures-timer 3.0.2", @@ -6248,7 +6248,7 @@ dependencies = [ [[package]] name = "sc-consensus-uncles" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "log", "sc-client-api", @@ -6261,7 +6261,7 @@ dependencies = [ [[package]] name = "sc-executor" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "assert_matches", "derive_more", @@ -6296,7 +6296,7 @@ dependencies = [ [[package]] name = "sc-executor-common" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "log", @@ -6312,7 +6312,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmi" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "log", "parity-scale-codec", @@ -6326,7 +6326,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "assert_matches", "cranelift-codegen", @@ -6347,7 +6347,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "assert_matches", "derive_more", @@ -6391,7 +6391,7 @@ dependencies = [ [[package]] name = "sc-finality-grandpa-rpc" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "finality-grandpa", @@ -6408,7 +6408,7 @@ dependencies = [ [[package]] name = "sc-informant" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "ansi_term 0.12.1", "futures 0.3.4", @@ -6424,7 +6424,7 @@ dependencies = [ [[package]] name = "sc-keystore" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "hex", @@ -6439,7 +6439,7 @@ dependencies = [ [[package]] name = "sc-network" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "assert_matches", "async-std", @@ -6499,7 +6499,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "async-std", "futures 0.3.4", @@ -6517,7 +6517,7 @@ dependencies = [ [[package]] name = "sc-network-test" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "env_logger 0.7.1", "futures 0.3.4", @@ -6543,7 +6543,7 @@ dependencies = [ [[package]] name = "sc-offchain" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "bytes 0.5.4", "env_logger 0.7.1", @@ -6576,7 +6576,7 @@ dependencies = [ [[package]] name = "sc-peerset" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "libp2p", @@ -6589,7 +6589,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -6597,7 +6597,7 @@ dependencies = [ [[package]] name = "sc-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "assert_matches", "futures 0.1.29", @@ -6636,7 +6636,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "futures 0.3.4", @@ -6659,7 +6659,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "jsonrpc-core", "jsonrpc-http-server", @@ -6673,7 +6673,7 @@ dependencies = [ [[package]] name = "sc-runtime-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "sp-allocator", "sp-core", @@ -6686,7 +6686,7 @@ dependencies = [ [[package]] name = "sc-service" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "exit-future", @@ -6747,7 +6747,7 @@ dependencies = [ [[package]] name = "sc-service-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "env_logger 0.7.1", "fdlimit", @@ -6782,7 +6782,7 @@ dependencies = [ [[package]] name = "sc-state-db" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "env_logger 0.7.1", "log", @@ -6796,7 +6796,7 @@ dependencies = [ [[package]] name = "sc-telemetry" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "bytes 0.5.4", "futures 0.3.4", @@ -6817,7 +6817,7 @@ dependencies = [ [[package]] name = "sc-tracing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "erased-serde", "log", @@ -6832,7 +6832,7 @@ dependencies = [ [[package]] name = "sc-transaction-graph" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "assert_matches", "criterion 0.3.1", @@ -6855,7 +6855,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "assert_matches", "derive_more", @@ -7226,7 +7226,7 @@ dependencies = [ [[package]] name = "sp-allocator" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "log", @@ -7237,7 +7237,7 @@ dependencies = [ [[package]] name = "sp-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "hash-db", "parity-scale-codec", @@ -7252,7 +7252,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "blake2-rfc", "proc-macro-crate", @@ -7263,7 +7263,7 @@ dependencies = [ [[package]] name = "sp-api-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "criterion 0.3.1", "parity-scale-codec", @@ -7282,7 +7282,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "serde", @@ -7293,7 +7293,7 @@ dependencies = [ [[package]] name = "sp-application-crypto-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "sp-api", "sp-application-crypto", @@ -7304,7 +7304,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "criterion 0.3.1", "integer-sqrt", @@ -7320,7 +7320,7 @@ dependencies = [ [[package]] name = "sp-arithmetic-fuzzer" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "honggfuzz", "num-bigint", @@ -7331,7 +7331,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7342,7 +7342,7 @@ dependencies = [ [[package]] name = "sp-authorship" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7352,7 +7352,7 @@ dependencies = [ [[package]] name = "sp-block-builder" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7363,7 +7363,7 @@ dependencies = [ [[package]] name = "sp-blockchain" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "log", @@ -7378,7 +7378,7 @@ dependencies = [ [[package]] name = "sp-chain-spec" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "serde", "serde_json", @@ -7386,7 +7386,7 @@ dependencies = [ [[package]] name = "sp-consensus" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "derive_more", "futures 0.3.4", @@ -7409,7 +7409,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7422,7 +7422,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "merlin", "parity-scale-codec", @@ -7438,7 +7438,7 @@ dependencies = [ [[package]] name = "sp-consensus-pow" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7449,7 +7449,7 @@ dependencies = [ [[package]] name = "sp-consensus-vrf" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "parity-scale-codec", "schnorrkel", @@ -7460,7 +7460,7 @@ dependencies = [ [[package]] name = "sp-core" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "base58", "blake2-rfc", @@ -7506,7 +7506,7 @@ dependencies = [ [[package]] name = "sp-database" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "kvdb", "parking_lot 0.10.2", @@ -7514,7 +7514,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro2", "quote 1.0.3", @@ -7523,7 +7523,7 @@ dependencies = [ [[package]] name = "sp-externalities" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "environmental", "parity-scale-codec", @@ -7533,7 +7533,7 @@ dependencies = [ [[package]] name = "sp-finality-grandpa" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "finality-grandpa", "log", @@ -7548,7 +7548,7 @@ dependencies = [ [[package]] name = "sp-finality-tracker" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-inherents", @@ -7557,7 +7557,7 @@ dependencies = [ [[package]] name = "sp-inherents" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "parity-scale-codec", @@ -7568,7 +7568,7 @@ dependencies = [ [[package]] name = "sp-io" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "hash-db", @@ -7587,7 +7587,7 @@ dependencies = [ [[package]] name = "sp-keyring" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "lazy_static", "sp-core", @@ -7597,7 +7597,7 @@ dependencies = [ [[package]] name = "sp-offchain" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "sp-api", "sp-core", @@ -7607,7 +7607,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "backtrace", "log", @@ -7615,7 +7615,7 @@ dependencies = [ [[package]] name = "sp-phragmen" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "rand 0.7.3", @@ -7630,7 +7630,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -7651,7 +7651,7 @@ dependencies = [ [[package]] name = "sp-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "serde", "serde_json", @@ -7660,7 +7660,7 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "hash256-std-hasher", "impl-trait-for-tuples", @@ -7682,7 +7682,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "primitive-types", @@ -7702,7 +7702,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "Inflector", "proc-macro-crate", @@ -7713,7 +7713,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "sc-executor", "sp-core", @@ -7728,7 +7728,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "sp-core", "sp-io", @@ -7739,7 +7739,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "sp-core", "sp-io", @@ -7750,7 +7750,7 @@ dependencies = [ [[package]] name = "sp-sandbox" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "assert_matches", "parity-scale-codec", @@ -7764,7 +7764,7 @@ dependencies = [ [[package]] name = "sp-serializer" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "serde", "serde_json", @@ -7772,7 +7772,7 @@ dependencies = [ [[package]] name = "sp-session" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-api", @@ -7784,7 +7784,7 @@ dependencies = [ [[package]] name = "sp-staking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "sp-runtime", @@ -7793,7 +7793,7 @@ dependencies = [ [[package]] name = "sp-state-machine" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "hash-db", "hex-literal", @@ -7813,11 +7813,11 @@ dependencies = [ [[package]] name = "sp-std" -version = "2.0.0-rc1" +version = "2.0.0-rc2" [[package]] name = "sp-storage" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "impl-serde 0.2.3", "ref-cast", @@ -7828,7 +7828,7 @@ dependencies = [ [[package]] name = "sp-test-primitives" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "parity-scale-codec", "parity-util-mem", @@ -7840,7 +7840,7 @@ dependencies = [ [[package]] name = "sp-timestamp" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -7853,14 +7853,14 @@ dependencies = [ [[package]] name = "sp-tracing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "tracing", ] [[package]] name = "sp-transaction-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "futures 0.3.4", @@ -7874,7 +7874,7 @@ dependencies = [ [[package]] name = "sp-trie" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "criterion 0.2.11", "hash-db", @@ -7892,7 +7892,7 @@ dependencies = [ [[package]] name = "sp-utils" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "futures-core", @@ -7902,7 +7902,7 @@ dependencies = [ [[package]] name = "sp-version" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "impl-serde 0.2.3", "parity-scale-codec", @@ -7913,7 +7913,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -8028,7 +8028,7 @@ dependencies = [ [[package]] name = "subkey" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "clap", "derive_more", @@ -8070,7 +8070,7 @@ dependencies = [ [[package]] name = "substrate-browser-utils" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "chrono", "clear_on_drop", @@ -8096,14 +8096,14 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "platforms", ] [[package]] name = "substrate-frame-rpc-support" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "frame-support", "frame-system", @@ -8119,7 +8119,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "env_logger 0.7.1", "frame-system-rpc-runtime-api", @@ -8142,7 +8142,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" -version = "0.8.0-rc1" +version = "0.8.0-rc2" dependencies = [ "async-std", "derive_more", @@ -8155,7 +8155,7 @@ dependencies = [ [[package]] name = "substrate-test-client" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "hash-db", @@ -8175,7 +8175,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "cfg-if", "frame-executive", @@ -8218,7 +8218,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-client" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "futures 0.3.4", "parity-scale-codec", @@ -8237,7 +8237,7 @@ dependencies = [ [[package]] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "derive_more", "futures 0.3.4", @@ -8252,7 +8252,7 @@ dependencies = [ [[package]] name = "substrate-test-utils" -version = "2.0.0-rc1" +version = "2.0.0-rc2" [[package]] name = "substrate-wasm-builder" diff --git a/bin/node-template/node/Cargo.toml b/bin/node-template/node/Cargo.toml index 4e8b3ff196..79f63f211a 100644 --- a/bin/node-template/node/Cargo.toml +++ b/bin/node-template/node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Anonymous"] description = "Substrate Node template" edition = "2018" @@ -21,25 +21,25 @@ log = "0.4.8" structopt = "0.3.8" parking_lot = "0.10.0" -sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } -sc-service = { version = "0.8.0-rc1", path = "../../../client/service" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } -sc-transaction-pool = { version = "2.0.0-rc1", path = "../../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } -sc-network = { version = "0.8.0-rc1", path = "../../../client/network" } -sc-consensus-aura = { version = "0.8.0-rc1", path = "../../../client/consensus/aura" } -sp-consensus-aura = { version = "0.8.0-rc1", path = "../../../primitives/consensus/aura" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } -sc-finality-grandpa = { version = "0.8.0-rc1", path = "../../../client/finality-grandpa" } -sp-finality-grandpa = { version = "2.0.0-rc1", path = "../../../primitives/finality-grandpa" } -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-rc1"} +sc-cli = { version = "0.8.0-rc2", path = "../../../client/cli" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sc-executor = { version = "0.8.0-rc2", path = "../../../client/executor" } +sc-service = { version = "0.8.0-rc2", path = "../../../client/service" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../primitives/transaction-pool" } +sc-network = { version = "0.8.0-rc2", path = "../../../client/network" } +sc-consensus-aura = { version = "0.8.0-rc2", path = "../../../client/consensus/aura" } +sp-consensus-aura = { version = "0.8.0-rc2", path = "../../../primitives/consensus/aura" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-rc2", path = "../../../client/consensus/common" } +sc-finality-grandpa = { version = "0.8.0-rc2", path = "../../../client/finality-grandpa" } +sp-finality-grandpa = { version = "2.0.0-rc2", path = "../../../primitives/finality-grandpa" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sc-basic-authorship = { path = "../../../client/basic-authorship", version = "0.8.0-rc2"} -node-template-runtime = { version = "2.0.0-rc1", path = "../runtime" } +node-template-runtime = { version = "2.0.0-rc2", path = "../runtime" } [build-dependencies] -substrate-build-script-utils = { version = "2.0.0-rc1", path = "../../../utils/build-script-utils" } +substrate-build-script-utils = { version = "2.0.0-rc2", path = "../../../utils/build-script-utils" } diff --git a/bin/node-template/pallets/template/Cargo.toml b/bin/node-template/pallets/template/Cargo.toml index 1bfd6fe5b2..15e7cfd4ba 100644 --- a/bin/node-template/pallets/template/Cargo.toml +++ b/bin/node-template/pallets/template/Cargo.toml @@ -2,7 +2,7 @@ authors = ['Anonymous'] edition = '2018' name = 'pallet-template' -version = "2.0.0-rc1" +version = "2.0.0-rc2" license = "Unlicense" homepage = "https://substrate.dev" repository = "https://github.com/paritytech/substrate/" @@ -16,26 +16,26 @@ codec = { package = "parity-scale-codec", version = "1.3.0", default-features = [dependencies.frame-support] default-features = false -version = "2.0.0-rc1" +version = "2.0.0-rc2" path = "../../../../frame/support" [dependencies.frame-system] default-features = false -version = "2.0.0-rc1" +version = "2.0.0-rc2" path = "../../../../frame/system" [dev-dependencies.sp-core] default-features = false -version = "2.0.0-rc1" +version = "2.0.0-rc2" path = "../../../../primitives/core" [dev-dependencies.sp-io] default-features = false -version = "2.0.0-rc1" +version = "2.0.0-rc2" path = "../../../../primitives/io" [dev-dependencies.sp-runtime] default-features = false -version = "2.0.0-rc1" +version = "2.0.0-rc2" path = "../../../../primitives/runtime" diff --git a/bin/node-template/runtime/Cargo.toml b/bin/node-template/runtime/Cargo.toml index fcec09ccea..d6ee62cb1a 100644 --- a/bin/node-template/runtime/Cargo.toml +++ b/bin/node-template/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-template-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Anonymous"] edition = "2018" license = "Unlicense" @@ -13,31 +13,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -aura = { version = "2.0.0-rc1", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } -balances = { version = "2.0.0-rc1", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/support" } -grandpa = { version = "2.0.0-rc1", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } -randomness-collective-flip = { version = "2.0.0-rc1", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } -sudo = { version = "2.0.0-rc1", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } -system = { version = "2.0.0-rc1", default-features = false, package = "frame-system", path = "../../../frame/system" } -timestamp = { version = "2.0.0-rc1", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } -transaction-payment = { version = "2.0.0-rc1", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } -frame-executive = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/executive" } +aura = { version = "2.0.0-rc2", default-features = false, package = "pallet-aura", path = "../../../frame/aura" } +balances = { version = "2.0.0-rc2", default-features = false, package = "pallet-balances", path = "../../../frame/balances" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/support" } +grandpa = { version = "2.0.0-rc2", default-features = false, package = "pallet-grandpa", path = "../../../frame/grandpa" } +randomness-collective-flip = { version = "2.0.0-rc2", default-features = false, package = "pallet-randomness-collective-flip", path = "../../../frame/randomness-collective-flip" } +sudo = { version = "2.0.0-rc2", default-features = false, package = "pallet-sudo", path = "../../../frame/sudo" } +system = { version = "2.0.0-rc2", default-features = false, package = "frame-system", path = "../../../frame/system" } +timestamp = { version = "2.0.0-rc2", default-features = false, package = "pallet-timestamp", path = "../../../frame/timestamp" } +transaction-payment = { version = "2.0.0-rc2", default-features = false, package = "pallet-transaction-payment", path = "../../../frame/transaction-payment" } +frame-executive = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/executive" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/api" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-rc1"} -sp-consensus-aura = { version = "0.8.0-rc1", default-features = false, path = "../../../primitives/consensus/aura" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } -sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-rc1"} -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/io" } -sp-offchain = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/offchain" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/session" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } -sp-transaction-pool = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/version" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/api" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-rc2"} +sp-consensus-aura = { version = "0.8.0-rc2", default-features = false, path = "../../../primitives/consensus/aura" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/core" } +sp-inherents = { path = "../../../primitives/inherents", default-features = false, version = "2.0.0-rc2"} +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/io" } +sp-offchain = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/offchain" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +sp-session = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/session" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } +sp-transaction-pool = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/version" } -template = { version = "2.0.0-rc1", default-features = false, path = "../pallets/template", package = "pallet-template" } +template = { version = "2.0.0-rc2", default-features = false, path = "../pallets/template", package = "pallet-template" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/bin/node/bench/Cargo.toml b/bin/node/bench/Cargo.toml index 53eb5d507a..0cb8e006d0 100644 --- a/bin/node/bench/Cargo.toml +++ b/bin/node/bench/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-bench" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Substrate node integration benchmarks." edition = "2018" @@ -10,21 +10,21 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] log = "0.4.8" -node-primitives = { version = "2.0.0-rc1", path = "../primitives" } -node-testing = { version = "2.0.0-rc1", path = "../testing" } -node-runtime = { version = "2.0.0-rc1", path = "../runtime" } -sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api/" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +node-primitives = { version = "2.0.0-rc2", path = "../primitives" } +node-testing = { version = "2.0.0-rc2", path = "../testing" } +node-runtime = { version = "2.0.0-rc2", path = "../runtime" } +sc-cli = { version = "0.8.0-rc2", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api/" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } serde = "1.0.101" serde_json = "1.0.41" structopt = "0.3" derive_more = "0.99.2" kvdb = "0.6" kvdb-rocksdb = "0.8" -sp-trie = { version = "2.0.0-rc1", path = "../../../primitives/trie" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-trie = { version = "2.0.0-rc2", path = "../../../primitives/trie" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } hash-db = "0.15.2" tempfile = "3.1.0" fs_extra = "1" diff --git a/bin/node/browser-testing/Cargo.toml b/bin/node/browser-testing/Cargo.toml index 07a74b5671..7628582fbb 100644 --- a/bin/node/browser-testing/Cargo.toml +++ b/bin/node/browser-testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-browser-testing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Tests for the in-browser light client." edition = "2018" @@ -17,5 +17,5 @@ wasm-bindgen-futures = "0.4.10" wasm-bindgen-test = "0.3.10" futures = "0.3.4" -node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-rc1"} -sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-rc1"} +node-cli = { path = "../cli", default-features = false, features = ["browser"] , version = "2.0.0-rc2"} +sc-rpc-api = { path = "../../../client/rpc-api" , version = "0.8.0-rc2"} diff --git a/bin/node/cli/Cargo.toml b/bin/node/cli/Cargo.toml index 2efb58aeeb..f2b25068ed 100644 --- a/bin/node/cli/Cargo.toml +++ b/bin/node/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-cli" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Generic Substrate node implementation in Rust." build = "build.rs" @@ -46,76 +46,76 @@ tracing = "0.1.10" parking_lot = "0.10.0" # primitives -sp-authority-discovery = { version = "2.0.0-rc1", path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } -grandpa-primitives = { version = "2.0.0-rc1", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/timestamp" } -sp-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/finality-tracker" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } -sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } +sp-authority-discovery = { version = "2.0.0-rc2", path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../../primitives/consensus/babe" } +grandpa-primitives = { version = "2.0.0-rc2", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/timestamp" } +sp-finality-tracker = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/finality-tracker" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } +sp-keyring = { version = "2.0.0-rc2", path = "../../../primitives/keyring" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../primitives/transaction-pool" } # client dependencies -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } -sc-chain-spec = { version = "2.0.0-rc1", path = "../../../client/chain-spec" } -sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } -sc-transaction-pool = { version = "2.0.0-rc1", path = "../../../client/transaction-pool" } -sc-network = { version = "0.8.0-rc1", path = "../../../client/network" } -sc-consensus-babe = { version = "0.8.0-rc1", path = "../../../client/consensus/babe" } -grandpa = { version = "0.8.0-rc1", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } -sc-client-db = { version = "0.8.0-rc1", default-features = false, path = "../../../client/db" } -sc-offchain = { version = "2.0.0-rc1", path = "../../../client/offchain" } -sc-rpc = { version = "2.0.0-rc1", path = "../../../client/rpc" } -sc-basic-authorship = { version = "0.8.0-rc1", path = "../../../client/basic-authorship" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } -sc-tracing = { version = "2.0.0-rc1", path = "../../../client/tracing" } -sc-telemetry = { version = "2.0.0-rc1", path = "../../../client/telemetry" } -sc-authority-discovery = { version = "0.8.0-rc1", path = "../../../client/authority-discovery" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api" } +sc-chain-spec = { version = "2.0.0-rc2", path = "../../../client/chain-spec" } +sc-consensus = { version = "0.8.0-rc2", path = "../../../client/consensus/common" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../../../client/transaction-pool" } +sc-network = { version = "0.8.0-rc2", path = "../../../client/network" } +sc-consensus-babe = { version = "0.8.0-rc2", path = "../../../client/consensus/babe" } +grandpa = { version = "0.8.0-rc2", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" } +sc-client-db = { version = "0.8.0-rc2", default-features = false, path = "../../../client/db" } +sc-offchain = { version = "2.0.0-rc2", path = "../../../client/offchain" } +sc-rpc = { version = "2.0.0-rc2", path = "../../../client/rpc" } +sc-basic-authorship = { version = "0.8.0-rc2", path = "../../../client/basic-authorship" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../../client/service" } +sc-tracing = { version = "2.0.0-rc2", path = "../../../client/tracing" } +sc-telemetry = { version = "2.0.0-rc2", path = "../../../client/telemetry" } +sc-authority-discovery = { version = "0.8.0-rc2", path = "../../../client/authority-discovery" } # frame dependencies -pallet-indices = { version = "2.0.0-rc1", path = "../../../frame/indices" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/timestamp" } -pallet-contracts = { version = "2.0.0-rc1", path = "../../../frame/contracts" } -frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/support" } -pallet-im-online = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/im-online" } -pallet-authority-discovery = { version = "2.0.0-rc1", path = "../../../frame/authority-discovery" } -pallet-staking = { version = "2.0.0-rc1", path = "../../../frame/staking" } -pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-rc2", path = "../../../frame/indices" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/timestamp" } +pallet-contracts = { version = "2.0.0-rc2", path = "../../../frame/contracts" } +frame-system = { version = "2.0.0-rc2", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-rc2", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-rc2", path = "../../../frame/transaction-payment" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/support" } +pallet-im-online = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/im-online" } +pallet-authority-discovery = { version = "2.0.0-rc2", path = "../../../frame/authority-discovery" } +pallet-staking = { version = "2.0.0-rc2", path = "../../../frame/staking" } +pallet-grandpa = { version = "2.0.0-rc2", path = "../../../frame/grandpa" } # node-specific dependencies -node-runtime = { version = "2.0.0-rc1", path = "../runtime" } -node-rpc = { version = "2.0.0-rc1", path = "../rpc" } -node-primitives = { version = "2.0.0-rc1", path = "../primitives" } -node-executor = { version = "2.0.0-rc1", path = "../executor" } +node-runtime = { version = "2.0.0-rc2", path = "../runtime" } +node-rpc = { version = "2.0.0-rc2", path = "../rpc" } +node-primitives = { version = "2.0.0-rc2", path = "../primitives" } +node-executor = { version = "2.0.0-rc2", path = "../executor" } # CLI-specific dependencies -sc-cli = { version = "0.8.0-rc1", optional = true, path = "../../../client/cli" } -frame-benchmarking-cli = { version = "2.0.0-rc1", optional = true, path = "../../../utils/frame/benchmarking-cli" } -node-inspect = { version = "0.8.0-rc1", optional = true, path = "../inspect" } +sc-cli = { version = "0.8.0-rc2", optional = true, path = "../../../client/cli" } +frame-benchmarking-cli = { version = "2.0.0-rc2", optional = true, path = "../../../utils/frame/benchmarking-cli" } +node-inspect = { version = "0.8.0-rc2", optional = true, path = "../inspect" } # WASM-specific dependencies wasm-bindgen = { version = "0.2.57", optional = true } wasm-bindgen-futures = { version = "0.4.7", optional = true } -browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-rc1"} +browser-utils = { package = "substrate-browser-utils", path = "../../../utils/browser", optional = true, version = "0.8.0-rc2"} [target.'cfg(target_arch="x86_64")'.dependencies] -node-executor = { version = "2.0.0-rc1", path = "../executor", features = [ "wasmtime" ] } -sc-cli = { version = "0.8.0-rc1", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } +node-executor = { version = "2.0.0-rc2", path = "../executor", features = [ "wasmtime" ] } +sc-cli = { version = "0.8.0-rc2", optional = true, path = "../../../client/cli", features = [ "wasmtime" ] } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../../client/service", features = [ "wasmtime" ] } [dev-dependencies] -sc-keystore = { version = "2.0.0-rc1", path = "../../../client/keystore" } -sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } -sc-consensus-babe = { version = "0.8.0-rc1", features = ["test-helpers"], path = "../../../client/consensus/babe" } -sc-consensus-epochs = { version = "0.8.0-rc1", path = "../../../client/consensus/epochs" } -sc-service-test = { version = "2.0.0-rc1", path = "../../../client/service/test" } +sc-keystore = { version = "2.0.0-rc2", path = "../../../client/keystore" } +sc-consensus = { version = "0.8.0-rc2", path = "../../../client/consensus/common" } +sc-consensus-babe = { version = "0.8.0-rc2", features = ["test-helpers"], path = "../../../client/consensus/babe" } +sc-consensus-epochs = { version = "0.8.0-rc2", path = "../../../client/consensus/epochs" } +sc-service-test = { version = "2.0.0-rc2", path = "../../../client/service/test" } futures = "0.3.4" tempfile = "3.1.0" assert_cmd = "1.0" @@ -126,12 +126,12 @@ platforms = "0.2.1" [build-dependencies] structopt = { version = "0.3.8", optional = true } -node-inspect = { version = "0.8.0-rc1", optional = true, path = "../inspect" } -frame-benchmarking-cli = { version = "2.0.0-rc1", optional = true, path = "../../../utils/frame/benchmarking-cli" } -substrate-build-script-utils = { version = "2.0.0-rc1", optional = true, path = "../../../utils/build-script-utils" } +node-inspect = { version = "0.8.0-rc2", optional = true, path = "../inspect" } +frame-benchmarking-cli = { version = "2.0.0-rc2", optional = true, path = "../../../utils/frame/benchmarking-cli" } +substrate-build-script-utils = { version = "2.0.0-rc2", optional = true, path = "../../../utils/build-script-utils" } [build-dependencies.sc-cli] -version = "0.8.0-rc1" +version = "0.8.0-rc2" package = "sc-cli" path = "../../../client/cli" optional = true diff --git a/bin/node/executor/Cargo.toml b/bin/node/executor/Cargo.toml index 101a080668..83a16a023f 100644 --- a/bin/node/executor/Cargo.toml +++ b/bin/node/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-executor" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Substrate node implementation in Rust." edition = "2018" @@ -13,34 +13,34 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -node-primitives = { version = "2.0.0-rc1", path = "../primitives" } -node-runtime = { version = "2.0.0-rc1", path = "../runtime" } -sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } -sp-trie = { version = "2.0.0-rc1", path = "../../../primitives/trie" } +node-primitives = { version = "2.0.0-rc2", path = "../primitives" } +node-runtime = { version = "2.0.0-rc2", path = "../runtime" } +sc-executor = { version = "0.8.0-rc2", path = "../../../client/executor" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } +sp-trie = { version = "2.0.0-rc2", path = "../../../primitives/trie" } trie-root = "0.16.0" -frame-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/benchmarking" } +frame-benchmarking = { version = "2.0.0-rc2", path = "../../../frame/benchmarking" } [dev-dependencies] criterion = "0.3.0" -frame-support = { version = "2.0.0-rc1", path = "../../../frame/support" } -frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } -node-testing = { version = "2.0.0-rc1", path = "../testing" } -pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } -pallet-contracts = { version = "2.0.0-rc1", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-rc1", path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-rc1", path = "../../../frame/indices" } -pallet-session = { version = "2.0.0-rc1", path = "../../../frame/session" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-rc1", path = "../../../frame/treasury" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-externalities = { version = "0.8.0-rc1", path = "../../../primitives/externalities" } -substrate-test-client = { version = "2.0.0-rc1", path = "../../../test-utils/client" } +frame-support = { version = "2.0.0-rc2", path = "../../../frame/support" } +frame-system = { version = "2.0.0-rc2", path = "../../../frame/system" } +node-testing = { version = "2.0.0-rc2", path = "../testing" } +pallet-balances = { version = "2.0.0-rc2", path = "../../../frame/balances" } +pallet-contracts = { version = "2.0.0-rc2", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-rc2", path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-rc2", path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-rc2", path = "../../../frame/indices" } +pallet-session = { version = "2.0.0-rc2", path = "../../../frame/session" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-rc2", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-rc2", path = "../../../frame/treasury" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../../primitives/application-crypto" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-externalities = { version = "0.8.0-rc2", path = "../../../primitives/externalities" } +substrate-test-client = { version = "2.0.0-rc2", path = "../../../test-utils/client" } wabt = "0.9.2" [features] diff --git a/bin/node/inspect/Cargo.toml b/bin/node/inspect/Cargo.toml index 7f75bd2ca3..6006e8c15c 100644 --- a/bin/node/inspect/Cargo.toml +++ b/bin/node/inspect/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-inspect" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,10 +14,10 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0" } derive_more = "0.99" log = "0.4.8" -sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sc-cli = { version = "0.8.0-rc2", path = "../../../client/cli" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../../client/service" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } structopt = "0.3.8" diff --git a/bin/node/primitives/Cargo.toml b/bin/node/primitives/Cargo.toml index ff45a3d81d..55ee2c3829 100644 --- a/bin/node/primitives/Cargo.toml +++ b/bin/node/primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-primitives" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,13 +12,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system" } -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/application-crypto" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/system" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } [dev-dependencies] -sp-serializer = { version = "2.0.0-rc1", path = "../../../primitives/serializer" } +sp-serializer = { version = "2.0.0-rc2", path = "../../../primitives/serializer" } pretty_assertions = "0.6.1" [features] diff --git a/bin/node/rpc-client/Cargo.toml b/bin/node/rpc-client/Cargo.toml index c81a5a5ba9..0b529d116c 100644 --- a/bin/node/rpc-client/Cargo.toml +++ b/bin/node/rpc-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc-client" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,5 +16,5 @@ futures = "0.1.29" hyper = "0.12.35" jsonrpc-core-client = { version = "14.0.5", default-features = false, features = ["http"] } log = "0.4.8" -node-primitives = { version = "2.0.0-rc1", path = "../primitives" } -sc-rpc = { version = "2.0.0-rc1", path = "../../../client/rpc" } +node-primitives = { version = "2.0.0-rc2", path = "../primitives" } +sc-rpc = { version = "2.0.0-rc2", path = "../../../client/rpc" } diff --git a/bin/node/rpc/Cargo.toml b/bin/node/rpc/Cargo.toml index f5dbf72ea1..00b8be99b1 100644 --- a/bin/node/rpc/Cargo.toml +++ b/bin/node/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -11,23 +11,23 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api" } jsonrpc-core = "14.0.3" -node-primitives = { version = "2.0.0-rc1", path = "../primitives" } -node-runtime = { version = "2.0.0-rc1", path = "../runtime" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -pallet-contracts-rpc = { version = "0.8.0-rc1", path = "../../../frame/contracts/rpc/" } -pallet-transaction-payment-rpc = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment/rpc/" } -substrate-frame-rpc-system = { version = "2.0.0-rc1", path = "../../../utils/frame/rpc/system" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } -sc-consensus-babe = { version = "0.8.0-rc1", path = "../../../client/consensus/babe" } -sc-consensus-babe-rpc = { version = "0.8.0-rc1", path = "../../../client/consensus/babe/rpc" } -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } -sc-keystore = { version = "2.0.0-rc1", path = "../../../client/keystore" } -sc-consensus-epochs = { version = "0.8.0-rc1", path = "../../../client/consensus/epochs" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sc-finality-grandpa = { version = "0.8.0-rc1", path = "../../../client/finality-grandpa" } -sc-finality-grandpa-rpc = { version = "0.8.0-rc1", path = "../../../client/finality-grandpa/rpc" } -sc-rpc-api = { version = "0.8.0-rc1", path = "../../../client/rpc-api" } +node-primitives = { version = "2.0.0-rc2", path = "../primitives" } +node-runtime = { version = "2.0.0-rc2", path = "../runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +pallet-contracts-rpc = { version = "0.8.0-rc2", path = "../../../frame/contracts/rpc/" } +pallet-transaction-payment-rpc = { version = "2.0.0-rc2", path = "../../../frame/transaction-payment/rpc/" } +substrate-frame-rpc-system = { version = "2.0.0-rc2", path = "../../../utils/frame/rpc/system" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../primitives/transaction-pool" } +sc-consensus-babe = { version = "0.8.0-rc2", path = "../../../client/consensus/babe" } +sc-consensus-babe-rpc = { version = "0.8.0-rc2", path = "../../../client/consensus/babe/rpc" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../../primitives/consensus/babe" } +sc-keystore = { version = "2.0.0-rc2", path = "../../../client/keystore" } +sc-consensus-epochs = { version = "0.8.0-rc2", path = "../../../client/consensus/epochs" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sc-finality-grandpa = { version = "0.8.0-rc2", path = "../../../client/finality-grandpa" } +sc-finality-grandpa-rpc = { version = "0.8.0-rc2", path = "../../../client/finality-grandpa/rpc" } +sc-rpc-api = { version = "0.8.0-rc2", path = "../../../client/rpc-api" } diff --git a/bin/node/runtime/Cargo.toml b/bin/node/runtime/Cargo.toml index b3591f12bc..1bf61c046d 100644 --- a/bin/node/runtime/Cargo.toml +++ b/bin/node/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -20,68 +20,68 @@ serde = { version = "1.0.102", optional = true } static_assertions = "1.1.0" # primitives -sp-authority-discovery = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/authority-discovery" } -sp-consensus-babe = { version = "0.8.0-rc1", default-features = false, path = "../../../primitives/consensus/babe" } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-rc1"} -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/inherents" } -node-primitives = { version = "2.0.0-rc1", default-features = false, path = "../primitives" } -sp-offchain = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/offchain" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/staking" } -sp-keyring = { version = "2.0.0-rc1", optional = true, path = "../../../primitives/keyring" } -sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/session" } -sp-transaction-pool = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/transaction-pool" } -sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/version" } +sp-authority-discovery = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/authority-discovery" } +sp-consensus-babe = { version = "0.8.0-rc2", default-features = false, path = "../../../primitives/consensus/babe" } +sp-block-builder = { path = "../../../primitives/block-builder", default-features = false, version = "2.0.0-rc2"} +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/inherents" } +node-primitives = { version = "2.0.0-rc2", default-features = false, path = "../primitives" } +sp-offchain = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/offchain" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/staking" } +sp-keyring = { version = "2.0.0-rc2", optional = true, path = "../../../primitives/keyring" } +sp-session = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/session" } +sp-transaction-pool = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/transaction-pool" } +sp-version = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/version" } # frame dependencies -frame-executive = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/executive" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/benchmarking", optional = true } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system" } -frame-system-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system/benchmarking", optional = true } -frame-system-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } -pallet-authority-discovery = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/authority-discovery" } -pallet-authorship = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/authorship" } -pallet-babe = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/babe" } -pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/balances" } -pallet-collective = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/collective" } -pallet-contracts = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/contracts" } -pallet-contracts-primitives = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/contracts/common/" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-rc1", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } -pallet-democracy = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/democracy" } -pallet-elections-phragmen = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/elections-phragmen" } -pallet-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/finality-tracker" } -pallet-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/grandpa" } -pallet-im-online = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/im-online" } -pallet-indices = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/indices" } -pallet-identity = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/identity" } -pallet-membership = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/membership" } -pallet-offences = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/offences" } -pallet-offences-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } -pallet-randomness-collective-flip = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/randomness-collective-flip" } -pallet-recovery = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/recovery" } -pallet-session = { version = "2.0.0-rc1", features = ["historical"], path = "../../../frame/session", default-features = false } -pallet-session-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/session/benchmarking", default-features = false, optional = true } -pallet-staking = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/staking" } -pallet-staking-reward-curve = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/staking/reward-curve" } -pallet-scheduler = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/scheduler" } -pallet-society = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/society" } -pallet-sudo = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/sudo" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/timestamp" } -pallet-treasury = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/treasury" } -pallet-utility = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/utility" } -pallet-transaction-payment = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/transaction-payment" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } -pallet-vesting = { version = "2.0.0-rc1", default-features = false, path = "../../../frame/vesting" } +frame-executive = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/executive" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/benchmarking", optional = true } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/system" } +frame-system-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/system/benchmarking", optional = true } +frame-system-rpc-runtime-api = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/system/rpc/runtime-api/" } +pallet-authority-discovery = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/authority-discovery" } +pallet-authorship = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/authorship" } +pallet-babe = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/babe" } +pallet-balances = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/balances" } +pallet-collective = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/collective" } +pallet-contracts = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/contracts" } +pallet-contracts-primitives = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/contracts/common/" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-rc2", default-features = false, path = "../../../frame/contracts/rpc/runtime-api/" } +pallet-democracy = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/democracy" } +pallet-elections-phragmen = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/elections-phragmen" } +pallet-finality-tracker = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/finality-tracker" } +pallet-grandpa = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/grandpa" } +pallet-im-online = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/im-online" } +pallet-indices = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/indices" } +pallet-identity = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/identity" } +pallet-membership = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/membership" } +pallet-offences = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/offences" } +pallet-offences-benchmarking = { version = "2.0.0-rc2", path = "../../../frame/offences/benchmarking", default-features = false, optional = true } +pallet-randomness-collective-flip = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/randomness-collective-flip" } +pallet-recovery = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/recovery" } +pallet-session = { version = "2.0.0-rc2", features = ["historical"], path = "../../../frame/session", default-features = false } +pallet-session-benchmarking = { version = "2.0.0-rc2", path = "../../../frame/session/benchmarking", default-features = false, optional = true } +pallet-staking = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/staking" } +pallet-staking-reward-curve = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/staking/reward-curve" } +pallet-scheduler = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/scheduler" } +pallet-society = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/society" } +pallet-sudo = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/sudo" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/timestamp" } +pallet-treasury = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/treasury" } +pallet-utility = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/utility" } +pallet-transaction-payment = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/transaction-payment" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/transaction-payment/rpc/runtime-api/" } +pallet-vesting = { version = "2.0.0-rc2", default-features = false, path = "../../../frame/vesting" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } [dev-dependencies] -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/bin/node/testing/Cargo.toml b/bin/node/testing/Cargo.toml index 1feb707125..7fe39763a4 100644 --- a/bin/node/testing/Cargo.toml +++ b/bin/node/testing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "node-testing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Test utilities for Substrate node." edition = "2018" @@ -13,40 +13,40 @@ publish = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } -sc-service = { version = "0.8.0-rc1", features = ["test-helpers", "db"], path = "../../../client/service" } -sc-client-db = { version = "0.8.0-rc1", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api/" } +pallet-balances = { version = "2.0.0-rc2", path = "../../../frame/balances" } +sc-service = { version = "0.8.0-rc2", features = ["test-helpers", "db"], path = "../../../client/service" } +sc-client-db = { version = "0.8.0-rc2", path = "../../../client/db/", features = ["kvdb-rocksdb", "parity-db"] } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api/" } codec = { package = "parity-scale-codec", version = "1.3.0" } -pallet-contracts = { version = "2.0.0-rc1", path = "../../../frame/contracts" } -pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } -pallet-indices = { version = "2.0.0-rc1", path = "../../../frame/indices" } -sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } -node-executor = { version = "2.0.0-rc1", path = "../executor" } -node-primitives = { version = "2.0.0-rc1", path = "../primitives" } -node-runtime = { version = "2.0.0-rc1", path = "../runtime" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } -frame-support = { version = "2.0.0-rc1", path = "../../../frame/support" } -pallet-session = { version = "2.0.0-rc1", path = "../../../frame/session" } -pallet-society = { version = "2.0.0-rc1", path = "../../../frame/society" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -pallet-staking = { version = "2.0.0-rc1", path = "../../../frame/staking" } -sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor", features = ["wasmtime"] } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } -substrate-test-client = { version = "2.0.0-rc1", path = "../../../test-utils/client" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../../../frame/timestamp" } -pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } -pallet-treasury = { version = "2.0.0-rc1", path = "../../../frame/treasury" } +pallet-contracts = { version = "2.0.0-rc2", path = "../../../frame/contracts" } +pallet-grandpa = { version = "2.0.0-rc2", path = "../../../frame/grandpa" } +pallet-indices = { version = "2.0.0-rc2", path = "../../../frame/indices" } +sp-keyring = { version = "2.0.0-rc2", path = "../../../primitives/keyring" } +node-executor = { version = "2.0.0-rc2", path = "../executor" } +node-primitives = { version = "2.0.0-rc2", path = "../primitives" } +node-runtime = { version = "2.0.0-rc2", path = "../runtime" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } +frame-support = { version = "2.0.0-rc2", path = "../../../frame/support" } +pallet-session = { version = "2.0.0-rc2", path = "../../../frame/session" } +pallet-society = { version = "2.0.0-rc2", path = "../../../frame/society" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-rc2", path = "../../../frame/staking" } +sc-executor = { version = "0.8.0-rc2", path = "../../../client/executor", features = ["wasmtime"] } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +frame-system = { version = "2.0.0-rc2", path = "../../../frame/system" } +substrate-test-client = { version = "2.0.0-rc2", path = "../../../test-utils/client" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../../../frame/timestamp" } +pallet-transaction-payment = { version = "2.0.0-rc2", path = "../../../frame/transaction-payment" } +pallet-treasury = { version = "2.0.0-rc2", path = "../../../frame/treasury" } wabt = "0.9.2" -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sp-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/finality-tracker" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/timestamp" } -sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sp-finality-tracker = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/finality-tracker" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/timestamp" } +sp-block-builder = { version = "2.0.0-rc2", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../../client/block-builder" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } log = "0.4.8" tempfile = "3.1.0" fs_extra = "1" @@ -54,4 +54,4 @@ futures = "0.3.1" [dev-dependencies] criterion = "0.3.0" -sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } +sc-cli = { version = "0.8.0-rc2", path = "../../../client/cli" } diff --git a/bin/utils/chain-spec-builder/Cargo.toml b/bin/utils/chain-spec-builder/Cargo.toml index 919a500718..7ac1da4606 100644 --- a/bin/utils/chain-spec-builder/Cargo.toml +++ b/bin/utils/chain-spec-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chain-spec-builder" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,9 +13,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" -sc-keystore = { version = "2.0.0-rc1", path = "../../../client/keystore" } -sc-chain-spec = { version = "2.0.0-rc1", path = "../../../client/chain-spec" } -node-cli = { version = "2.0.0-rc1", path = "../../node/cli" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sc-keystore = { version = "2.0.0-rc2", path = "../../../client/keystore" } +sc-chain-spec = { version = "2.0.0-rc2", path = "../../../client/chain-spec" } +node-cli = { version = "2.0.0-rc2", path = "../../node/cli" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } rand = "0.7.2" structopt = "0.3.8" diff --git a/bin/utils/subkey/Cargo.toml b/bin/utils/subkey/Cargo.toml index 43076062d3..c955ac3dd1 100644 --- a/bin/utils/subkey/Cargo.toml +++ b/bin/utils/subkey/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "subkey" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,10 +12,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.1.29" -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -node-runtime = { version = "2.0.0-rc1", path = "../../node/runtime" } -node-primitives = { version = "2.0.0-rc1", path = "../../node/primitives" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +node-runtime = { version = "2.0.0-rc2", path = "../../node/runtime" } +node-primitives = { version = "2.0.0-rc2", path = "../../node/primitives" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } rand = "0.7.2" clap = "2.33.0" tiny-bip39 = "0.7" @@ -23,14 +23,14 @@ substrate-bip39 = "0.4.1" hex = "0.4.0" hex-literal = "0.2.1" codec = { package = "parity-scale-codec", version = "1.3.0" } -frame-system = { version = "2.0.0-rc1", path = "../../../frame/system" } -pallet-balances = { version = "2.0.0-rc1", path = "../../../frame/balances" } -pallet-transaction-payment = { version = "2.0.0-rc1", path = "../../../frame/transaction-payment" } -pallet-grandpa = { version = "2.0.0-rc1", path = "../../../frame/grandpa" } +frame-system = { version = "2.0.0-rc2", path = "../../../frame/system" } +pallet-balances = { version = "2.0.0-rc2", path = "../../../frame/balances" } +pallet-transaction-payment = { version = "2.0.0-rc2", path = "../../../frame/transaction-payment" } +pallet-grandpa = { version = "2.0.0-rc2", path = "../../../frame/grandpa" } rpassword = "4.0.1" itertools = "0.8.2" derive_more = { version = "0.99.2" } -sc-rpc = { version = "2.0.0-rc1", path = "../../../client/rpc" } +sc-rpc = { version = "2.0.0-rc2", path = "../../../client/rpc" } jsonrpc-core-client = { version = "14.0.3", features = ["http"] } hyper = "0.12.35" libp2p = "0.19.1" diff --git a/client/api/Cargo.toml b/client/api/Cargo.toml index 8afe365363..f46c45a691 100644 --- a/client/api/Cargo.toml +++ b/client/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,36 +14,36 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } derive_more = { version = "0.99.2" } -sc-executor = { version = "0.8.0-rc1", path = "../executor" } -sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } +sc-executor = { version = "0.8.0-rc2", path = "../executor" } +sp-externalities = { version = "0.8.0-rc2", path = "../../primitives/externalities" } fnv = { version = "1.0.6" } futures = { version = "0.3.1" } hash-db = { version = "0.15.2", default-features = false } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } hex-literal = { version = "0.2.1" } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } kvdb = "0.6.0" log = { version = "0.4.8" } parking_lot = "0.10.0" lazy_static = "1.4.0" -sp-database = { version = "2.0.0-rc1", path = "../../primitives/database" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/version" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } -sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } -sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc1", path = "../../utils/prometheus" } +sp-database = { version = "2.0.0-rc2", path = "../../primitives/database" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-version = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/version" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } +sp-trie = { version = "2.0.0-rc2", path = "../../primitives/trie" } +sp-storage = { version = "2.0.0-rc2", path = "../../primitives/storage" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc2", path = "../../utils/prometheus" } [dev-dependencies] kvdb-memorydb = "0.6.0" -sp-test-primitives = { version = "2.0.0-rc1", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../test-utils/runtime" } +sp-test-primitives = { version = "2.0.0-rc2", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../test-utils/runtime" } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 3a40adf7c6..c32fb67c51 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-authority-discovery" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -23,21 +23,21 @@ futures = "0.3.4" futures-timer = "3.0.1" libp2p = { version = "0.19.1", default-features = false, features = ["secp256k1", "libp2p-websocket"] } log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc2"} prost = "0.6.1" rand = "0.7.2" -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } -sc-network = { version = "0.8.0-rc1", path = "../network" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sc-keystore = { version = "2.0.0-rc2", path = "../keystore" } +sc-network = { version = "0.8.0-rc2", path = "../network" } serde_json = "1.0.41" -sp-authority-discovery = { version = "2.0.0-rc1", path = "../../primitives/authority-discovery" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-authority-discovery = { version = "2.0.0-rc2", path = "../../primitives/authority-discovery" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } [dev-dependencies] env_logger = "0.7.0" quickcheck = "0.9.0" -sc-peerset = { version = "2.0.0-rc1", path = "../peerset" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client"} +sc-peerset = { version = "2.0.0-rc2", path = "../peerset" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client"} diff --git a/client/basic-authorship/Cargo.toml b/client/basic-authorship/Cargo.toml index a452f08524..dad9c54f84 100644 --- a/client/basic-authorship/Cargo.toml +++ b/client/basic-authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-basic-authorship" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,21 +16,21 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-rc1", path = "../../primitives/inherents" } -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } -sc-proposer-metrics = { version = "0.8.0-rc1", path = "../proposer-metrics" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc2"} +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-rc2", path = "../../primitives/inherents" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +sc-block-builder = { version = "0.8.0-rc2", path = "../block-builder" } +sc-proposer-metrics = { version = "0.8.0-rc2", path = "../proposer-metrics" } tokio-executor = { version = "0.2.0-alpha.6", features = ["blocking"] } [dev-dependencies] -sc-transaction-pool = { version = "2.0.0-rc1", path = "../../client/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../../client/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } parking_lot = "0.10.0" diff --git a/client/block-builder/Cargo.toml b/client/block-builder/Cargo.toml index 0be48deb49..fb5add1d8f 100644 --- a/client/block-builder/Cargo.toml +++ b/client/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-block-builder" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-block-builder = { version = "2.0.0-rc1", path = "../../primitives/block-builder" } -sc-client-api = { version = "2.0.0-rc1", path = "../api" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-block-builder = { version = "2.0.0-rc2", path = "../../primitives/block-builder" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } [dev-dependencies] substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } -sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } +sp-trie = { version = "2.0.0-rc2", path = "../../primitives/trie" } diff --git a/client/chain-spec/Cargo.toml b/client/chain-spec/Cargo.toml index aa32d97b25..eee78ef676 100644 --- a/client/chain-spec/Cargo.toml +++ b/client/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,12 +12,12 @@ description = "Substrate chain configurations." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-chain-spec-derive = { version = "2.0.0-rc1", path = "./derive" } +sc-chain-spec-derive = { version = "2.0.0-rc2", path = "./derive" } impl-trait-for-tuples = "0.1.3" -sc-network = { version = "0.8.0-rc1", path = "../network" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-chain-spec = { version = "2.0.0-rc1", path = "../../primitives/chain-spec" } -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-chain-spec = { version = "2.0.0-rc2", path = "../../primitives/chain-spec" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } diff --git a/client/chain-spec/derive/Cargo.toml b/client/chain-spec/derive/Cargo.toml index 4bda059264..1f753689ae 100644 --- a/client/chain-spec/derive/Cargo.toml +++ b/client/chain-spec/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec-derive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index dd751612df..8c19da95c4 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-cli" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Substrate CLI interface." edition = "2018" @@ -25,23 +25,23 @@ tokio = { version = "0.2.9", features = [ "signal", "rt-core", "rt-threaded" ] } futures = "0.3.4" fdlimit = "0.1.4" serde_json = "1.0.41" -sc-informant = { version = "0.8.0-rc1", path = "../informant" } -sp-panic-handler = { version = "2.0.0-rc1", path = "../../primitives/panic-handler" } -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../service" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } -substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-rc1"} -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +sc-informant = { version = "0.8.0-rc2", path = "../informant" } +sp-panic-handler = { version = "2.0.0-rc2", path = "../../primitives/panic-handler" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-rc2", path = "../../primitives/version" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../service" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } +substrate-prometheus-endpoint = { path = "../../utils/prometheus" , version = "0.8.0-rc2"} +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } names = "0.11.0" structopt = "0.3.8" -sc-tracing = { version = "2.0.0-rc1", path = "../tracing" } +sc-tracing = { version = "2.0.0-rc2", path = "../tracing" } chrono = "0.4.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } diff --git a/client/consensus/aura/Cargo.toml b/client/consensus/aura/Cargo.toml index b9be82bd63..afd7246266 100644 --- a/client/consensus/aura/Cargo.toml +++ b/client/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-aura" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Aura consensus algorithm for substrate" edition = "2018" @@ -12,37 +12,37 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-rc1", path = "../../../primitives/consensus/aura" } -sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-rc2", path = "../../../primitives/consensus/aura" } +sp-block-builder = { version = "2.0.0-rc2", path = "../../../primitives/block-builder" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../../client/block-builder" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } derive_more = "0.99.2" futures = "0.3.4" futures-timer = "3.0.1" -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } -sc-keystore = { version = "2.0.0-rc1", path = "../../keystore" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } +sc-keystore = { version = "2.0.0-rc2", path = "../../keystore" } log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } -sp-version = { version = "2.0.0-rc1", path = "../../../primitives/version" } -sc-consensus-slots = { version = "0.8.0-rc1", path = "../slots" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-timestamp = { version = "2.0.0-rc1", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-rc1", path = "../../telemetry" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } +sp-version = { version = "2.0.0-rc2", path = "../../../primitives/version" } +sc-consensus-slots = { version = "0.8.0-rc2", path = "../slots" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-timestamp = { version = "2.0.0-rc2", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-rc2", path = "../../telemetry" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc2"} [dev-dependencies] -sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-rc1", path = "../../executor" } -sc-network = { version = "0.8.0-rc1", path = "../../network" } -sc-network-test = { version = "0.8.0-rc1", path = "../../network/test" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc2", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-rc2", path = "../../executor" } +sc-network = { version = "0.8.0-rc2", path = "../../network" } +sc-network-test = { version = "0.8.0-rc2", path = "../../network/test" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/Cargo.toml b/client/consensus/babe/Cargo.toml index 154d1509d2..ca77b14d0e 100644 --- a/client/consensus/babe/Cargo.toml +++ b/client/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "BABE consensus algorithm for substrate" edition = "2018" @@ -14,31 +14,31 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../../primitives/consensus/babe" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../../primitives/application-crypto" } num-bigint = "0.2.3" num-rational = "0.2.2" num-traits = "0.2.8" serde = { version = "1.0.104", features = ["derive"] } -sp-version = { version = "2.0.0-rc1", path = "../../../primitives/version" } -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } -sp-timestamp = { version = "2.0.0-rc1", path = "../../../primitives/timestamp" } -sc-telemetry = { version = "2.0.0-rc1", path = "../../telemetry" } -sc-keystore = { version = "2.0.0-rc1", path = "../../keystore" } -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sc-consensus-epochs = { version = "0.8.0-rc1", path = "../epochs" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sp-consensus-vrf = { version = "0.8.0-rc1", path = "../../../primitives/consensus/vrf" } -sc-consensus-uncles = { version = "0.8.0-rc1", path = "../uncles" } -sc-consensus-slots = { version = "0.8.0-rc1", path = "../slots" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -fork-tree = { version = "2.0.0-rc1", path = "../../../utils/fork-tree" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} +sp-version = { version = "2.0.0-rc2", path = "../../../primitives/version" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } +sp-timestamp = { version = "2.0.0-rc2", path = "../../../primitives/timestamp" } +sc-telemetry = { version = "2.0.0-rc2", path = "../../telemetry" } +sc-keystore = { version = "2.0.0-rc2", path = "../../keystore" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sc-consensus-epochs = { version = "0.8.0-rc2", path = "../epochs" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sp-block-builder = { version = "2.0.0-rc2", path = "../../../primitives/block-builder" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sp-consensus-vrf = { version = "0.8.0-rc2", path = "../../../primitives/consensus/vrf" } +sc-consensus-uncles = { version = "0.8.0-rc2", path = "../uncles" } +sc-consensus-slots = { version = "0.8.0-rc2", path = "../slots" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +fork-tree = { version = "2.0.0-rc2", path = "../../../utils/fork-tree" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc2"} futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" @@ -50,13 +50,13 @@ pdqselect = "0.1.0" derive_more = "0.99.2" [dev-dependencies] -sp-keyring = { version = "2.0.0-rc1", path = "../../../primitives/keyring" } -sc-executor = { version = "0.8.0-rc1", path = "../../executor" } -sc-network = { version = "0.8.0-rc1", path = "../../network" } -sc-network-test = { version = "0.8.0-rc1", path = "../../network/test" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../service" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../block-builder" } +sp-keyring = { version = "2.0.0-rc2", path = "../../../primitives/keyring" } +sc-executor = { version = "0.8.0-rc2", path = "../../executor" } +sc-network = { version = "0.8.0-rc2", path = "../../network" } +sc-network-test = { version = "0.8.0-rc2", path = "../../network/test" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../service" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../block-builder" } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/babe/rpc/Cargo.toml b/client/consensus/babe/rpc/Cargo.toml index 22c95b6cd1..20f7e48758 100644 --- a/client/consensus/babe/rpc/Cargo.toml +++ b/client/consensus/babe/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-babe-rpc" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "RPC extensions for the BABE consensus algorithm" edition = "2018" @@ -12,27 +12,27 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-consensus-babe = { version = "0.8.0-rc1", path = "../" } -sc-rpc-api = { version = "0.8.0-rc1", path = "../../../rpc-api" } +sc-consensus-babe = { version = "0.8.0-rc2", path = "../" } +sc-rpc-api = { version = "0.8.0-rc2", path = "../../../rpc-api" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../../primitives/consensus/babe" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../../../primitives/consensus/babe" } serde = { version = "1.0.104", features=["derive"] } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../../primitives/runtime" } -sc-consensus-epochs = { version = "0.8.0-rc1", path = "../../epochs" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../../primitives/runtime" } +sc-consensus-epochs = { version = "0.8.0-rc2", path = "../../epochs" } futures = { version = "0.3.4", features = ["compat"] } derive_more = "0.99.2" -sp-api = { version = "2.0.0-rc1", path = "../../../../primitives/api" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../../primitives/consensus/common" } -sp-core = { version = "2.0.0-rc1", path = "../../../../primitives/core" } -sc-keystore = { version = "2.0.0-rc1", path = "../../../keystore" } +sp-api = { version = "2.0.0-rc2", path = "../../../../primitives/api" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-rc2", path = "../../../../primitives/core" } +sc-keystore = { version = "2.0.0-rc2", path = "../../../keystore" } [dev-dependencies] -sc-consensus = { version = "0.8.0-rc1", path = "../../../consensus/common" } +sc-consensus = { version = "0.8.0-rc2", path = "../../../consensus/common" } serde_json = "1.0.50" -sp-application-crypto = { version = "2.0.0-rc1", path = "../../../../primitives/application-crypto" } -sp-keyring = { version = "2.0.0-rc1", path = "../../../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../../test-utils/runtime/client" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../../../primitives/application-crypto" } +sp-keyring = { version = "2.0.0-rc2", path = "../../../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../../test-utils/runtime/client" } tempfile = "3.1.0" diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index c4743c2175..256237900b 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,7 +12,7 @@ description = "Collection of common consensus specific imlementations for Substr targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } diff --git a/client/consensus/epochs/Cargo.toml b/client/consensus/epochs/Cargo.toml index 04397da31d..969d4f7d2c 100644 --- a/client/consensus/epochs/Cargo.toml +++ b/client/consensus/epochs/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-epochs" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Generic epochs-based utilities for consensus" edition = "2018" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -fork-tree = { version = "2.0.0-rc1", path = "../../../utils/fork-tree" } -sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-rc1"} -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sc-client-api = { path = "../../api" , version = "2.0.0-rc1"} +fork-tree = { version = "2.0.0-rc2", path = "../../../utils/fork-tree" } +sp-runtime = { path = "../../../primitives/runtime" , version = "2.0.0-rc2"} +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sc-client-api = { path = "../../api" , version = "2.0.0-rc2"} diff --git a/client/consensus/manual-seal/Cargo.toml b/client/consensus/manual-seal/Cargo.toml index 84050547a5..de2bf68d76 100644 --- a/client/consensus/manual-seal/Cargo.toml +++ b/client/consensus/manual-seal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-manual-seal" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Manual sealing engine for Substrate" edition = "2018" @@ -22,20 +22,20 @@ parking_lot = "0.10.0" serde = { version = "1.0", features=["derive"] } assert_matches = "1.3.0" -sc-client-api = { path = "../../../client/api", version = "2.0.0-rc1" } -sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-rc1" } -sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-rc1" } -sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-rc1" } -sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-rc1" } -sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-rc1" } -sp-core = { path = "../../../primitives/core", version = "2.0.0-rc1" } -sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-rc1" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1" } +sc-client-api = { path = "../../../client/api", version = "2.0.0-rc2" } +sc-transaction-pool = { path = "../../transaction-pool", version = "2.0.0-rc2" } +sp-blockchain = { path = "../../../primitives/blockchain", version = "2.0.0-rc2" } +sp-consensus = { package = "sp-consensus", path = "../../../primitives/consensus/common", version = "0.8.0-rc2" } +sp-inherents = { path = "../../../primitives/inherents", version = "2.0.0-rc2" } +sp-runtime = { path = "../../../primitives/runtime", version = "2.0.0-rc2" } +sp-core = { path = "../../../primitives/core", version = "2.0.0-rc2" } +sp-transaction-pool = { path = "../../../primitives/transaction-pool", version = "2.0.0-rc2" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc2" } [dev-dependencies] -sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-rc1" } -substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-rc1" } -substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-rc1" } +sc-basic-authorship = { path = "../../basic-authorship", version = "0.8.0-rc2" } +substrate-test-runtime-client = { path = "../../../test-utils/runtime/client", version = "2.0.0-rc2" } +substrate-test-runtime-transaction-pool = { path = "../../../test-utils/runtime/transaction-pool", version = "2.0.0-rc2" } tokio = { version = "0.2", features = ["rt-core", "macros"] } env_logger = "0.7.0" tempfile = "3.1.0" diff --git a/client/consensus/pow/Cargo.toml b/client/consensus/pow/Cargo.toml index 252bd04990..c6eab29781 100644 --- a/client/consensus/pow/Cargo.toml +++ b/client/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-pow" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "PoW consensus algorithm for substrate" edition = "2018" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sp-block-builder = { version = "2.0.0-rc1", path = "../../../primitives/block-builder" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } -sp-consensus-pow = { version = "0.8.0-rc1", path = "../../../primitives/consensus/pow" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sp-block-builder = { version = "2.0.0-rc2", path = "../../../primitives/block-builder" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } +sp-consensus-pow = { version = "0.8.0-rc2", path = "../../../primitives/consensus/pow" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } log = "0.4.8" futures = { version = "0.3.1", features = ["compat"] } -sp-timestamp = { version = "2.0.0-rc1", path = "../../../primitives/timestamp" } +sp-timestamp = { version = "2.0.0-rc2", path = "../../../primitives/timestamp" } derive_more = "0.99.2" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc2"} diff --git a/client/consensus/slots/Cargo.toml b/client/consensus/slots/Cargo.toml index 25c6917138..6cc4a658e3 100644 --- a/client/consensus/slots/Cargo.toml +++ b/client/consensus/slots/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-slots" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Generic slots-based utilities for consensus" edition = "2018" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../../../primitives/application-crypto" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sc-telemetry = { version = "2.0.0-rc1", path = "../../telemetry" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../../primitives/application-crypto" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sc-telemetry = { version = "2.0.0-rc2", path = "../../telemetry" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } futures = "0.3.4" futures-timer = "3.0.1" parking_lot = "0.10.0" log = "0.4.8" [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } diff --git a/client/consensus/uncles/Cargo.toml b/client/consensus/uncles/Cargo.toml index cc97f18386..e01e0720b4 100644 --- a/client/consensus/uncles/Cargo.toml +++ b/client/consensus/uncles/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-consensus-uncles" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Generic uncle inclusion utilities for consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-authorship = { version = "2.0.0-rc1", path = "../../../primitives/authorship" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sp-inherents = { version = "2.0.0-rc1", path = "../../../primitives/inherents" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-authorship = { version = "2.0.0-rc2", path = "../../../primitives/authorship" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sp-inherents = { version = "2.0.0-rc2", path = "../../../primitives/inherents" } log = "0.4.8" diff --git a/client/db/Cargo.toml b/client/db/Cargo.toml index a33fe69643..32e6f9daa2 100644 --- a/client/db/Cargo.toml +++ b/client/db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-client-db" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -23,22 +23,22 @@ parity-util-mem = { version = "0.6.1", default-features = false, features = ["st codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } blake2-rfc = "0.2.18" -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sc-executor = { version = "0.8.0-rc1", path = "../executor" } -sc-state-db = { version = "0.8.0-rc1", path = "../state-db" } -sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-database = { version = "2.0.0-rc1", path = "../../primitives/database" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sc-executor = { version = "0.8.0-rc2", path = "../executor" } +sc-state-db = { version = "0.8.0-rc2", path = "../state-db" } +sp-trie = { version = "2.0.0-rc2", path = "../../primitives/trie" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-database = { version = "2.0.0-rc2", path = "../../primitives/database" } parity-db = { version = "0.1.2", optional = true } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc1", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc2", path = "../../utils/prometheus" } [dev-dependencies] -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } env_logger = "0.7.0" quickcheck = "0.9" kvdb-rocksdb = "0.8" diff --git a/client/executor/Cargo.toml b/client/executor/Cargo.toml index 2fbc1714c8..7290538f48 100644 --- a/client/executor/Cargo.toml +++ b/client/executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,22 +15,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } -sp-serializer = { version = "2.0.0-rc1", path = "../../primitives/serializer" } -sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } -sp-panic-handler = { version = "2.0.0-rc1", path = "../../primitives/panic-handler" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-trie = { version = "2.0.0-rc2", path = "../../primitives/trie" } +sp-serializer = { version = "2.0.0-rc2", path = "../../primitives/serializer" } +sp-version = { version = "2.0.0-rc2", path = "../../primitives/version" } +sp-panic-handler = { version = "2.0.0-rc2", path = "../../primitives/panic-handler" } wasmi = "0.6.2" parity-wasm = "0.41.0" lazy_static = "1.4.0" -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sp-wasm-interface = { version = "2.0.0-rc1", path = "../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-rc1", path = "../../primitives/runtime-interface" } -sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } -sc-executor-common = { version = "0.8.0-rc1", path = "common" } -sc-executor-wasmi = { version = "0.8.0-rc1", path = "wasmi" } -sc-executor-wasmtime = { version = "0.8.0-rc1", path = "wasmtime", optional = true } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc2", path = "../../primitives/runtime-interface" } +sp-externalities = { version = "0.8.0-rc2", path = "../../primitives/externalities" } +sc-executor-common = { version = "0.8.0-rc2", path = "common" } +sc-executor-wasmi = { version = "0.8.0-rc2", path = "wasmi" } +sc-executor-wasmtime = { version = "0.8.0-rc2", path = "wasmtime", optional = true } parking_lot = "0.10.0" log = "0.4.8" libsecp256k1 = "0.3.4" @@ -39,11 +39,11 @@ libsecp256k1 = "0.3.4" assert_matches = "1.3.0" wabt = "0.9.2" hex-literal = "0.2.1" -sc-runtime-test = { version = "2.0.0-rc1", path = "runtime-test" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../test-utils/runtime" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sc-runtime-test = { version = "2.0.0-rc2", path = "runtime-test" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../test-utils/runtime" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } test-case = "0.3.3" -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } [features] default = [ "std" ] diff --git a/client/executor/common/Cargo.toml b/client/executor/common/Cargo.toml index df9141d80c..f5d3c38c61 100644 --- a/client/executor/common/Cargo.toml +++ b/client/executor/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-common" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,11 +18,11 @@ derive_more = "0.99.2" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } wasmi = "0.6.2" -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-rc1", path = "../../../primitives/allocator" } -sp-wasm-interface = { version = "2.0.0-rc1", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-rc1", path = "../../../primitives/runtime-interface" } -sp-serializer = { version = "2.0.0-rc1", path = "../../../primitives/serializer" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-rc2", path = "../../../primitives/allocator" } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc2", path = "../../../primitives/runtime-interface" } +sp-serializer = { version = "2.0.0-rc2", path = "../../../primitives/serializer" } [features] default = [] diff --git a/client/executor/runtime-test/Cargo.toml b/client/executor/runtime-test/Cargo.toml index 6ad0338b59..5700ee2f98 100644 --- a/client/executor/runtime-test/Cargo.toml +++ b/client/executor/runtime-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-runtime-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,12 +13,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/io" } -sp-sandbox = { version = "0.8.0-rc1", default-features = false, path = "../../../primitives/sandbox" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -sp-allocator = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/allocator" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/io" } +sp-sandbox = { version = "0.8.0-rc2", default-features = false, path = "../../../primitives/sandbox" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +sp-allocator = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/allocator" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/client/executor/wasmi/Cargo.toml b/client/executor/wasmi/Cargo.toml index c170187658..0c16758c19 100644 --- a/client/executor/wasmi/Cargo.toml +++ b/client/executor/wasmi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmi" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4.8" wasmi = "0.6.2" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-rc1", path = "../common" } -sp-wasm-interface = { version = "2.0.0-rc1", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-rc1", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-rc1", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-rc2", path = "../common" } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc2", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-rc2", path = "../../../primitives/allocator" } diff --git a/client/executor/wasmtime/Cargo.toml b/client/executor/wasmtime/Cargo.toml index b2b4ee1753..2e6d33910c 100644 --- a/client/executor/wasmtime/Cargo.toml +++ b/client/executor/wasmtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-executor-wasmtime" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -16,11 +16,11 @@ log = "0.4.8" scoped-tls = "1.0" parity-wasm = "0.41.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor-common = { version = "0.8.0-rc1", path = "../common" } -sp-wasm-interface = { version = "2.0.0-rc1", path = "../../../primitives/wasm-interface" } -sp-runtime-interface = { version = "2.0.0-rc1", path = "../../../primitives/runtime-interface" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-allocator = { version = "2.0.0-rc1", path = "../../../primitives/allocator" } +sc-executor-common = { version = "0.8.0-rc2", path = "../common" } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../../../primitives/wasm-interface" } +sp-runtime-interface = { version = "2.0.0-rc2", path = "../../../primitives/runtime-interface" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-allocator = { version = "2.0.0-rc2", path = "../../../primitives/allocator" } wasmtime = { package = "substrate-wasmtime", version = "0.16.0-threadsafe.4" } wasmtime-runtime = { package = "substrate-wasmtime-runtime", version = "0.16.0-threadsafe.4" } wasmtime-environ = "0.16" diff --git a/client/finality-grandpa/Cargo.toml b/client/finality-grandpa/Cargo.toml index 40dfe7c319..44c9e0f0f3 100644 --- a/client/finality-grandpa/Cargo.toml +++ b/client/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -fork-tree = { version = "2.0.0-rc1", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-rc2", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" @@ -23,37 +23,37 @@ parking_lot = "0.10.0" rand = "0.7.2" assert_matches = "1.3.0" parity-scale-codec = { version = "1.3.0", features = ["derive"] } -sp-arithmetic = { version = "2.0.0-rc1", path = "../../primitives/arithmetic" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-rc1", path = "../../client/consensus/common" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } -sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } +sp-arithmetic = { version = "2.0.0-rc2", path = "../../primitives/arithmetic" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-rc2", path = "../../client/consensus/common" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } +sc-keystore = { version = "2.0.0-rc2", path = "../keystore" } serde_json = "1.0.41" -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-inherents = { version = "2.0.0-rc1", path = "../../primitives/inherents" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sc-network-gossip = { version = "0.8.0-rc1", path = "../network-gossip" } -sp-finality-tracker = { version = "2.0.0-rc1", path = "../../primitives/finality-tracker" } -sp-finality-grandpa = { version = "2.0.0-rc1", path = "../../primitives/finality-grandpa" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} -sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-inherents = { version = "2.0.0-rc2", path = "../../primitives/inherents" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sc-network-gossip = { version = "0.8.0-rc2", path = "../network-gossip" } +sp-finality-tracker = { version = "2.0.0-rc2", path = "../../primitives/finality-tracker" } +sp-finality-grandpa = { version = "2.0.0-rc2", path = "../../primitives/finality-grandpa" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc2"} +sc-block-builder = { version = "0.8.0-rc2", path = "../block-builder" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } pin-project = "0.4.6" [dev-dependencies] finality-grandpa = { version = "0.12.3", features = ["derive-codec", "test-helpers"] } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sc-network-test = { version = "0.8.0-rc1", path = "../network/test" } -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../primitives/consensus/babe" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sc-network-test = { version = "0.8.0-rc2", path = "../network/test" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../primitives/consensus/babe" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } env_logger = "0.7.0" tokio = { version = "0.2", features = ["rt-core"] } tempfile = "3.1.0" -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } diff --git a/client/finality-grandpa/rpc/Cargo.toml b/client/finality-grandpa/rpc/Cargo.toml index dbff14bd16..e1724c6c4e 100644 --- a/client/finality-grandpa/rpc/Cargo.toml +++ b/client/finality-grandpa/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-finality-grandpa-rpc" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "RPC extensions for the GRANDPA finality gadget" repository = "https://github.com/paritytech/substrate/" @@ -8,7 +8,7 @@ edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] -sc-finality-grandpa = { version = "0.8.0-rc1", path = "../" } +sc-finality-grandpa = { version = "0.8.0-rc2", path = "../" } finality-grandpa = { version = "0.12.3", features = ["derive-codec"] } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.3" @@ -20,4 +20,4 @@ log = "0.4.8" derive_more = "0.99.2" [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } diff --git a/client/informant/Cargo.toml b/client/informant/Cargo.toml index d4b6b96a27..cd24fa6958 100644 --- a/client/informant/Cargo.toml +++ b/client/informant/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-informant" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Substrate informant." edition = "2018" @@ -17,8 +17,8 @@ futures = "0.3.4" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } wasm-timer = "0.2" -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../service" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../service" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } diff --git a/client/keystore/Cargo.toml b/client/keystore/Cargo.toml index 1d4312f816..f02869762d 100644 --- a/client/keystore/Cargo.toml +++ b/client/keystore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-keystore" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../primitives/application-crypto" } hex = "0.4.0" rand = "0.7.2" serde_json = "1.0.41" diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index a45f96e8b9..e6dc57dc9c 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Gossiping for the Substrate network protocol" name = "sc-network-gossip" -version = "0.8.0-rc1" +version = "0.8.0-rc2" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -19,12 +19,12 @@ futures-timer = "3.0.1" libp2p = { version = "0.19.1", default-features = false, features = ["websocket"] } log = "0.4.8" lru = "0.4.3" -sc-network = { version = "0.8.0-rc1", path = "../network" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } wasm-timer = "0.2" [dev-dependencies] async-std = "1.5" quickcheck = "0.9.0" rand = "0.7.2" -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index daa5df0e15..6c6579a858 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate network protocol" name = "sc-network" -version = "0.8.0-rc1" +version = "0.8.0-rc2" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -26,7 +26,7 @@ derive_more = "0.99.2" either = "1.5.3" erased-serde = "0.3.9" fnv = "1.0.6" -fork-tree = { version = "2.0.0-rc1", path = "../../utils/fork-tree" } +fork-tree = { version = "2.0.0-rc2", path = "../../utils/fork-tree" } futures = "0.3.4" futures-timer = "3.0.1" futures_codec = "0.3.3" @@ -39,23 +39,23 @@ lru = "0.4.0" nohash-hasher = "0.2.0" parking_lot = "0.10.0" pin-project = "0.4.6" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc1", path = "../../utils/prometheus" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.8.0-rc2", path = "../../utils/prometheus" } prost = "0.6.1" rand = "0.7.2" -sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sc-peerset = { version = "2.0.0-rc1", path = "../peerset" } +sc-block-builder = { version = "0.8.0-rc2", path = "../block-builder" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sc-peerset = { version = "2.0.0-rc2", path = "../peerset" } serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } slog_derive = "0.2.0" smallvec = "0.6.10" -sp-arithmetic = { version = "2.0.0-rc1", path = "../../primitives/arithmetic" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +sp-arithmetic = { version = "2.0.0-rc2", path = "../../primitives/arithmetic" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } thiserror = "1" unsigned-varint = { version = "0.3.1", features = ["futures", "futures-codec"] } void = "1.0.2" @@ -74,10 +74,10 @@ env_logger = "0.7.0" libp2p = { version = "0.19.1", default-features = false, features = ["secio"] } quickcheck = "0.9.0" rand = "0.7.2" -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } -sp-test-primitives = { version = "2.0.0-rc1", path = "../../primitives/test-primitives" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } +sp-test-primitives = { version = "2.0.0-rc2", path = "../../primitives/test-primitives" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } tempfile = "3.1.0" [features] diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index 73a5d729d9..8695d30a68 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Integration tests for Substrate network protocol" name = "sc-network-test" -version = "0.8.0-rc1" +version = "0.8.0-rc2" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-network = { version = "0.8.0-rc1", path = "../" } +sc-network = { version = "0.8.0-rc2", path = "../" } log = "0.4.8" parking_lot = "0.10.0" futures = "0.3.4" futures-timer = "3.0.1" rand = "0.7.2" libp2p = { version = "0.19.1", default-features = false, features = ["libp2p-websocket"] } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../block-builder" } -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../../primitives/consensus/babe" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sc-consensus = { version = "0.8.0-rc2", path = "../../../client/consensus/common" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../block-builder" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../../primitives/consensus/babe" } env_logger = "0.7.0" -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../../test-utils/runtime" } tempfile = "3.1.0" -sc-service = { version = "0.8.0-rc1", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-service = { version = "0.8.0-rc2", default-features = false, features = ["test-helpers"], path = "../../service" } diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index 93d2ea5603..99f4ad66f3 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers" name = "sc-offchain" -version = "2.0.0-rc1" +version = "2.0.0-rc2" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,23 +13,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bytes = "0.5" -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } fnv = "1.0.6" futures = "0.3.4" futures-timer = "3.0.1" log = "0.4.8" threadpool = "1.7" num_cpus = "1.10" -sp-offchain = { version = "2.0.0-rc1", path = "../../primitives/offchain" } +sp-offchain = { version = "2.0.0-rc2", path = "../../primitives/offchain" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } rand = "0.7.2" -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sc-keystore = { version = "2.0.0-rc2", path = "../keystore" } [target.'cfg(not(target_os = "unknown"))'.dependencies] hyper = "0.13.2" @@ -38,10 +38,10 @@ hyper-rustls = "0.20" [dev-dependencies] env_logger = "0.7.0" fdlimit = "0.1.4" -sc-client-db = { version = "0.8.0-rc1", default-features = true, path = "../db/" } -sc-transaction-pool = { version = "2.0.0-rc1", path = "../../client/transaction-pool" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sc-client-db = { version = "0.8.0-rc2", default-features = true, path = "../db/" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../../client/transaction-pool" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } tokio = "0.2" [features] diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index 668d40cd60..60ec0a39ef 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -3,7 +3,7 @@ description = "Connectivity manager based on reputation" homepage = "http://parity.io" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" name = "sc-peerset" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" repository = "https://github.com/paritytech/substrate/" @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.4" libp2p = { version = "0.19.1", default-features = false } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils"} +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils"} log = "0.4.8" serde_json = "1.0.41" wasm-timer = "0.2" diff --git a/client/proposer-metrics/Cargo.toml b/client/proposer-metrics/Cargo.toml index 406f98fa71..4e2a807b5d 100644 --- a/client/proposer-metrics/Cargo.toml +++ b/client/proposer-metrics/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-proposer-metrics" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -13,4 +13,4 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] log = "0.4.8" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc2"} diff --git a/client/rpc-api/Cargo.toml b/client/rpc-api/Cargo.toml index e993291bad..1075c3a11c 100644 --- a/client/rpc-api/Cargo.toml +++ b/client/rpc-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-api" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -21,11 +21,11 @@ jsonrpc-derive = "14.0.3" jsonrpc-pubsub = "14.0.3" log = "0.4.8" parking_lot = "0.10.0" -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } -sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-rc1"} -sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-rc1"} +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-version = { version = "2.0.0-rc2", path = "../../primitives/version" } +sp-runtime = { path = "../../primitives/runtime" , version = "2.0.0-rc2"} +sp-chain-spec = { path = "../../primitives/chain-spec" , version = "2.0.0-rc2"} serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.41" -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -sp-rpc = { version = "2.0.0-rc1", path = "../../primitives/rpc" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +sp-rpc = { version = "2.0.0-rc2", path = "../../primitives/rpc" } diff --git a/client/rpc-servers/Cargo.toml b/client/rpc-servers/Cargo.toml index 65f4bb1a1e..401f5f4882 100644 --- a/client/rpc-servers/Cargo.toml +++ b/client/rpc-servers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc-server" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -17,7 +17,7 @@ pubsub = { package = "jsonrpc-pubsub", version = "14.0.3" } log = "0.4.8" serde = "1.0.101" serde_json = "1.0.41" -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } [target.'cfg(not(target_os = "unknown"))'.dependencies] http = { package = "jsonrpc-http-server", version = "14.0.3" } diff --git a/client/rpc/Cargo.toml b/client/rpc/Cargo.toml index ed67592741..62f9319575 100644 --- a/client/rpc/Cargo.toml +++ b/client/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -12,38 +12,38 @@ description = "Substrate Client RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-rpc-api = { version = "0.8.0-rc1", path = "../rpc-api" } -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } +sc-rpc-api = { version = "0.8.0-rc2", path = "../rpc-api" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.1", features = ["compat"] } jsonrpc-pubsub = "14.0.3" log = "0.4.8" -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } rpc = { package = "jsonrpc-core", version = "14.0.3" } -sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } +sp-version = { version = "2.0.0-rc2", path = "../../primitives/version" } serde_json = "1.0.41" -sp-session = { version = "2.0.0-rc1", path = "../../primitives/session" } -sp-offchain = { version = "2.0.0-rc1", path = "../../primitives/offchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } -sp-rpc = { version = "2.0.0-rc1", path = "../../primitives/rpc" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sp-chain-spec = { version = "2.0.0-rc1", path = "../../primitives/chain-spec" } -sc-executor = { version = "0.8.0-rc1", path = "../executor" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../client/block-builder" } -sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } +sp-session = { version = "2.0.0-rc2", path = "../../primitives/session" } +sp-offchain = { version = "2.0.0-rc2", path = "../../primitives/offchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } +sp-rpc = { version = "2.0.0-rc2", path = "../../primitives/rpc" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sp-chain-spec = { version = "2.0.0-rc2", path = "../../primitives/chain-spec" } +sc-executor = { version = "0.8.0-rc2", path = "../executor" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../client/block-builder" } +sc-keystore = { version = "2.0.0-rc2", path = "../keystore" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } hash-db = { version = "0.15.2", default-features = false } parking_lot = "0.10.0" [dev-dependencies] assert_matches = "1.3.0" futures01 = { package = "futures", version = "0.1.29" } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } tokio = "0.1.22" -sc-transaction-pool = { version = "2.0.0-rc1", path = "../transaction-pool" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../transaction-pool" } lazy_static = "1.4.0" diff --git a/client/service/Cargo.toml b/client/service/Cargo.toml index 699da80c46..fc5991bc3f 100644 --- a/client/service/Cargo.toml +++ b/client/service/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -39,38 +39,38 @@ hash-db = "0.15.2" serde = "1.0.101" serde_json = "1.0.41" sysinfo = "0.13.3" -sc-keystore = { version = "2.0.0-rc1", path = "../keystore" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-trie = { version = "2.0.0-rc1", path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } -sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-session = { version = "2.0.0-rc1", path = "../../primitives/session" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../../primitives/application-crypto" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sc-network = { version = "0.8.0-rc1", path = "../network" } -sc-chain-spec = { version = "2.0.0-rc1", path = "../chain-spec" } -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sc-client-db = { version = "0.8.0-rc1", default-features = false, path = "../db" } +sc-keystore = { version = "2.0.0-rc2", path = "../keystore" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-trie = { version = "2.0.0-rc2", path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-rc2", path = "../../primitives/externalities" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } +sp-version = { version = "2.0.0-rc2", path = "../../primitives/version" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-session = { version = "2.0.0-rc2", path = "../../primitives/session" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../primitives/application-crypto" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sc-network = { version = "0.8.0-rc2", path = "../network" } +sc-chain-spec = { version = "2.0.0-rc2", path = "../chain-spec" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sc-client-db = { version = "0.8.0-rc2", default-features = false, path = "../db" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-executor = { version = "0.8.0-rc1", path = "../executor" } -sc-transaction-pool = { version = "2.0.0-rc1", path = "../transaction-pool" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -sc-rpc-server = { version = "2.0.0-rc1", path = "../rpc-servers" } -sc-rpc = { version = "2.0.0-rc1", path = "../rpc" } -sc-block-builder = { version = "0.8.0-rc1", path = "../block-builder" } -sp-block-builder = { version = "2.0.0-rc1", path = "../../primitives/block-builder" } +sc-executor = { version = "0.8.0-rc2", path = "../executor" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../transaction-pool" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +sc-rpc-server = { version = "2.0.0-rc2", path = "../rpc-servers" } +sc-rpc = { version = "2.0.0-rc2", path = "../rpc" } +sc-block-builder = { version = "0.8.0-rc2", path = "../block-builder" } +sp-block-builder = { version = "2.0.0-rc2", path = "../../primitives/block-builder" } -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } -sc-offchain = { version = "2.0.0-rc1", path = "../offchain" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } +sc-offchain = { version = "2.0.0-rc2", path = "../offchain" } parity-multiaddr = { package = "parity-multiaddr", version = "0.7.3" } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-rc1"} -sc-tracing = { version = "2.0.0-rc1", path = "../tracing" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" , version = "0.8.0-rc2"} +sc-tracing = { version = "2.0.0-rc2", path = "../tracing" } tracing = "0.1.10" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } @@ -83,7 +83,7 @@ procfs = '0.7.8' [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } -sp-consensus-babe = { version = "0.8.0-rc1", path = "../../primitives/consensus/babe" } -grandpa = { version = "0.8.0-rc1", package = "sc-finality-grandpa", path = "../finality-grandpa" } -grandpa-primitives = { version = "2.0.0-rc1", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } +sp-consensus-babe = { version = "0.8.0-rc2", path = "../../primitives/consensus/babe" } +grandpa = { version = "0.8.0-rc2", package = "sc-finality-grandpa", path = "../finality-grandpa" } +grandpa-primitives = { version = "2.0.0-rc2", package = "sp-finality-grandpa", path = "../../primitives/finality-grandpa" } diff --git a/client/service/test/Cargo.toml b/client/service/test/Cargo.toml index d846638dca..4b55b19269 100644 --- a/client/service/test/Cargo.toml +++ b/client/service/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-service-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,24 +20,24 @@ log = "0.4.8" env_logger = "0.7.0" fdlimit = "0.1.4" parking_lot = "0.10.0" -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } -sp-externalities = { version = "0.8.0-rc1", path = "../../../primitives/externalities" } -sp-trie = { version = "2.0.0-rc1", path = "../../../primitives/trie" } -sp-storage = { version = "2.0.0-rc1", path = "../../../primitives/storage" } -sc-client-db = { version = "0.8.0-rc1", default-features = false, path = "../../db" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } +sp-externalities = { version = "0.8.0-rc2", path = "../../../primitives/externalities" } +sp-trie = { version = "2.0.0-rc2", path = "../../../primitives/trie" } +sp-storage = { version = "2.0.0-rc2", path = "../../../primitives/storage" } +sc-client-db = { version = "0.8.0-rc2", default-features = false, path = "../../db" } futures = { version = "0.3.1", features = ["compat"] } -sc-service = { version = "0.8.0-rc1", default-features = false, features = ["test-helpers"], path = "../../service" } -sc-network = { version = "0.8.0-rc1", path = "../../network" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../../test-utils/runtime" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } -sc-client-api = { version = "2.0.0-rc1", path = "../../api" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../block-builder" } -sc-executor = { version = "0.8.0-rc1", path = "../../executor" } -sp-panic-handler = { version = "2.0.0-rc1", path = "../../../primitives/panic-handler" } +sc-service = { version = "0.8.0-rc2", default-features = false, features = ["test-helpers"], path = "../../service" } +sc-network = { version = "0.8.0-rc2", path = "../../network" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../primitives/transaction-pool" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../../test-utils/runtime" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } +sc-client-api = { version = "2.0.0-rc2", path = "../../api" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../block-builder" } +sc-executor = { version = "0.8.0-rc2", path = "../../executor" } +sp-panic-handler = { version = "2.0.0-rc2", path = "../../../primitives/panic-handler" } parity-scale-codec = "1.3.0" diff --git a/client/state-db/Cargo.toml b/client/state-db/Cargo.toml index ddcaa1f139..e1b784c222 100644 --- a/client/state-db/Cargo.toml +++ b/client/state-db/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-state-db" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = "0.10.0" log = "0.4.8" -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parity-util-mem-derive = "0.1.0" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index 0f78e5d5bf..e88a9dc779 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-telemetry" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Telemetry utils" edition = "2018" diff --git a/client/tracing/Cargo.toml b/client/tracing/Cargo.toml index 1a59106bbe..dfcedddbd1 100644 --- a/client/tracing/Cargo.toml +++ b/client/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-tracing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -20,7 +20,7 @@ serde_json = "1.0.41" slog = { version = "2.5.2", features = ["nested-values"] } tracing-core = "0.1.7" -sc-telemetry = { version = "2.0.0-rc1", path = "../telemetry" } +sc-telemetry = { version = "2.0.0-rc2", path = "../telemetry" } [dev-dependencies] tracing = "0.1.10" diff --git a/client/transaction-pool/Cargo.toml b/client/transaction-pool/Cargo.toml index de3d34f1d4..0b394da357 100644 --- a/client/transaction-pool/Cargo.toml +++ b/client/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -20,21 +20,21 @@ intervalier = "0.4.0" log = "0.4.8" parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } parking_lot = "0.10.0" -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc1"} -sc-client-api = { version = "2.0.0-rc1", path = "../api" } -sc-transaction-graph = { version = "2.0.0-rc1", path = "./graph" } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-rc1", path = "../../primitives/tracing" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../primitives/transaction-pool" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-utils = { version = "2.0.0-rc1", path = "../../primitives/utils" } +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus", version = "0.8.0-rc2"} +sc-client-api = { version = "2.0.0-rc2", path = "../api" } +sc-transaction-graph = { version = "2.0.0-rc2", path = "./graph" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-rc2", path = "../../primitives/tracing" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-utils = { version = "2.0.0-rc2", path = "../../primitives/utils" } wasm-timer = "0.2" [dev-dependencies] assert_matches = "1.3.0" hex = "0.4" -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } -substrate-test-runtime-transaction-pool = { version = "2.0.0-rc1", path = "../../test-utils/runtime/transaction-pool" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } +substrate-test-runtime-transaction-pool = { version = "2.0.0-rc2", path = "../../test-utils/runtime/transaction-pool" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } diff --git a/client/transaction-pool/graph/Cargo.toml b/client/transaction-pool/graph/Cargo.toml index d7ad5db6a5..2290a29c8f 100644 --- a/client/transaction-pool/graph/Cargo.toml +++ b/client/transaction-pool/graph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-transaction-graph" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,18 +18,18 @@ log = "0.4.8" parking_lot = "0.10.0" serde = { version = "1.0.101", features = ["derive"] } wasm-timer = "0.2" -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-utils = { version = "2.0.0-rc1", path = "../../../primitives/utils" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-utils = { version = "2.0.0-rc2", path = "../../../primitives/utils" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../primitives/transaction-pool" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } linked-hash-map = "0.5.2" [dev-dependencies] assert_matches = "1.3.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../../test-utils/runtime" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../../test-utils/runtime" } criterion = "0.3" [[bench]] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 76fb1ac579..4c4cf46e5c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog]. ## Unreleased +## 2.0.0-rc1 -> 2.0.0-rc2 + + ## 2.0.0-alpha.8 -> 2.0.0-rc1 diff --git a/frame/assets/Cargo.toml b/frame/assets/Cargo.toml index 9b34e968ee..f40eab532e 100644 --- a/frame/assets/Cargo.toml +++ b/frame/assets/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-assets" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } # Needed for various traits. In our case, `OnFinalize`. -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } # Needed for type-safe access to storage DB. -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } # `system` module provides us with all sorts of useful stuff and macros depend on it being around. -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/aura/Cargo.toml b/frame/aura/Cargo.toml index 7221d2c2ce..bb964bd415 100644 --- a/frame/aura/Cargo.toml +++ b/frame/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-aura" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,23 +12,23 @@ description = "FRAME AURA consensus pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -sp-consensus-aura = { version = "0.8.0-rc1", path = "../../primitives/consensus/aura", default-features = false } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/timestamp" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } +pallet-session = { version = "2.0.0-rc2", default-features = false, path = "../session" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +sp-consensus-aura = { version = "0.8.0-rc2", path = "../../primitives/consensus/aura", default-features = false } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/timestamp" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../timestamp" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } lazy_static = "1.4.0" parking_lot = "0.10.0" diff --git a/frame/authority-discovery/Cargo.toml b/frame/authority-discovery/Cargo.toml index 99a17ec910..3aa36b5cac 100644 --- a/frame/authority-discovery/Cargo.toml +++ b/frame/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authority-discovery" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME pallet for authority discovery" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-authority-discovery = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/authority-discovery" } -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +sp-authority-discovery = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/authority-discovery" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-rc1", features = ["historical" ], path = "../session", default-features = false } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc2", features = ["historical" ], path = "../session", default-features = false } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } [features] default = ["std"] diff --git a/frame/authorship/Cargo.toml b/frame/authorship/Cargo.toml index 32faaa23b1..7bde40887a 100644 --- a/frame/authorship/Cargo.toml +++ b/frame/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-authorship" -version = "2.0.0-rc1" +version = "2.0.0-rc2" description = "Block and Uncle Author tracking for the FRAME" authors = ["Parity Technologies "] edition = "2018" @@ -13,17 +13,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-authorship = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/authorship" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-authorship = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/authorship" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/babe/Cargo.toml b/frame/babe/Cargo.toml index 6ad153ed5a..060b6ad1ec 100644 --- a/frame/babe/Cargo.toml +++ b/frame/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-babe" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,22 +14,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/timestamp" } -pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } -sp-consensus-babe = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/babe" } -sp-consensus-vrf = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/vrf" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../timestamp" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/timestamp" } +pallet-session = { version = "2.0.0-rc2", default-features = false, path = "../session" } +sp-consensus-babe = { version = "0.8.0-rc2", default-features = false, path = "../../primitives/consensus/babe" } +sp-consensus-vrf = { version = "0.8.0-rc2", default-features = false, path = "../../primitives/consensus/vrf" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/balances/Cargo.toml b/frame/balances/Cargo.toml index 9fc875f907..ae69fb17c2 100644 --- a/frame/balances/Cargo.toml +++ b/frame/balances/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-balances" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-transaction-payment = { version = "2.0.0-rc1", path = "../transaction-payment" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-transaction-payment = { version = "2.0.0-rc2", path = "../transaction-payment" } [features] default = ["std"] diff --git a/frame/benchmark/Cargo.toml b/frame/benchmark/Cargo.toml index 2d5f32d58e..6ef770b6c1 100644 --- a/frame/benchmark/Cargo.toml +++ b/frame/benchmark/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-benchmark" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std"] diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index 078283dfac..24db2adc48 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,13 +15,13 @@ targets = ["x86_64-unknown-linux-gnu"] linregress = "0.1" paste = "0.1" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api = { version = "2.0.0-rc1", path = "../../primitives/api", default-features = false } -sp-runtime-interface = { version = "2.0.0-rc1", path = "../../primitives/runtime-interface", default-features = false } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime", default-features = false } -sp-std = { version = "2.0.0-rc1", path = "../../primitives/std", default-features = false } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io", default-features = false } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-api = { version = "2.0.0-rc2", path = "../../primitives/api", default-features = false } +sp-runtime-interface = { version = "2.0.0-rc2", path = "../../primitives/runtime-interface", default-features = false } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime", default-features = false } +sp-std = { version = "2.0.0-rc2", path = "../../primitives/std", default-features = false } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io", default-features = false } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [features] default = [ "std" ] diff --git a/frame/collective/Cargo.toml b/frame/collective/Cargo.toml index 5a44cd8c79..d62b5ee580 100644 --- a/frame/collective/Cargo.toml +++ b/frame/collective/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-collective" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/contracts/Cargo.toml b/frame/contracts/Cargo.toml index b0f3760a3d..656836df37 100644 --- a/frame/contracts/Cargo.toml +++ b/frame/contracts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,23 +17,23 @@ pwasm-utils = { version = "0.12.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } parity-wasm = { version = "0.41.0", default-features = false } wasmi-validation = { version = "0.3.0", default-features = false } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-sandbox = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/sandbox" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-contracts-primitives = { version = "2.0.0-rc1", default-features = false, path = "common" } -pallet-transaction-payment = { version = "2.0.0-rc1", default-features = false, path = "../transaction-payment" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-sandbox = { version = "0.8.0-rc2", default-features = false, path = "../../primitives/sandbox" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-contracts-primitives = { version = "2.0.0-rc2", default-features = false, path = "common" } +pallet-transaction-payment = { version = "2.0.0-rc2", default-features = false, path = "../transaction-payment" } [dev-dependencies] wabt = "0.9.2" assert_matches = "1.3.0" hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../timestamp" } -pallet-randomness-collective-flip = { version = "2.0.0-rc1", path = "../randomness-collective-flip" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../timestamp" } +pallet-randomness-collective-flip = { version = "2.0.0-rc2", path = "../randomness-collective-flip" } [features] default = ["std"] diff --git a/frame/contracts/common/Cargo.toml b/frame/contracts/common/Cargo.toml index 00fa3917bc..c358a87734 100644 --- a/frame/contracts/common/Cargo.toml +++ b/frame/contracts/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-primitives" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # This crate should not rely on any of the frame primitives. codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } [features] default = ["std"] diff --git a/frame/contracts/rpc/Cargo.toml b/frame/contracts/rpc/Cargo.toml index 4bc3c84cb8..8ed233ed79 100644 --- a/frame/contracts/rpc/Cargo.toml +++ b/frame/contracts/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-rc1", path = "../../../primitives/rpc" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-rc2", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -pallet-contracts-primitives = { version = "2.0.0-rc1", path = "../common" } -pallet-contracts-rpc-runtime-api = { version = "0.8.0-rc1", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +pallet-contracts-primitives = { version = "2.0.0-rc2", path = "../common" } +pallet-contracts-rpc-runtime-api = { version = "0.8.0-rc2", path = "./runtime-api" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/contracts/rpc/runtime-api/Cargo.toml b/frame/contracts/rpc/runtime-api/Cargo.toml index 93b945c053..b998befcc8 100644 --- a/frame/contracts/rpc/runtime-api/Cargo.toml +++ b/frame/contracts/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-contracts-rpc-runtime-api" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Runtime API definition required by Contracts RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/runtime" } -pallet-contracts-primitives = { version = "2.0.0-rc1", default-features = false, path = "../../common" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/runtime" } +pallet-contracts-primitives = { version = "2.0.0-rc2", default-features = false, path = "../../common" } [features] default = ["std"] diff --git a/frame/democracy/Cargo.toml b/frame/democracy/Cargo.toml index 040571c5b3..433c37e4d8 100644 --- a/frame/democracy/Cargo.toml +++ b/frame/democracy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-democracy" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -pallet-scheduler = { version = "2.0.0-rc1", path = "../scheduler" } -sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } -substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +pallet-scheduler = { version = "2.0.0-rc2", path = "../scheduler" } +sp-storage = { version = "2.0.0-rc2", path = "../../primitives/storage" } +substrate-test-utils = { version = "2.0.0-rc2", path = "../../test-utils" } hex-literal = "0.2.1" [features] diff --git a/frame/elections-phragmen/Cargo.toml b/frame/elections-phragmen/Cargo.toml index 3a46b710b6..bea1e0dfc4 100644 --- a/frame/elections-phragmen/Cargo.toml +++ b/frame/elections-phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections-phragmen" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,19 +14,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-phragmen = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/phragmen" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/phragmen" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +substrate-test-utils = { version = "2.0.0-rc2", path = "../../test-utils" } [features] default = ["std"] diff --git a/frame/elections/Cargo.toml b/frame/elections/Cargo.toml index af5bc6d558..bd0dc2a1dd 100644 --- a/frame/elections/Cargo.toml +++ b/frame/elections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] hex-literal = "0.2.1" -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/evm/Cargo.toml b/frame/evm/Cargo.toml index 6d14dd1d95..03b213605d 100644 --- a/frame/evm/Cargo.toml +++ b/frame/evm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-evm" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } -pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../timestamp" } +pallet-balances = { version = "2.0.0-rc2", default-features = false, path = "../balances" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } primitive-types = { version = "0.7.0", default-features = false, features = ["rlp"] } rlp = { version = "0.4", default-features = false } evm = { version = "0.16", default-features = false } diff --git a/frame/example-offchain-worker/Cargo.toml b/frame/example-offchain-worker/Cargo.toml index d6ff25c841..0f57832a53 100644 --- a/frame/example-offchain-worker/Cargo.toml +++ b/frame/example-offchain-worker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example-offchain-worker" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -13,13 +13,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } lite-json = { version = "0.1", default-features = false } [features] diff --git a/frame/example/Cargo.toml b/frame/example/Cargo.toml index caeb34f532..f150a6fa2f 100644 --- a/frame/example/Cargo.toml +++ b/frame/example/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-example" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-rc2", default-features = false, path = "../balances" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/executive/Cargo.toml b/frame/executive/Cargo.toml index 07df7ce5a0..1484e14588 100644 --- a/frame/executive/Cargo.toml +++ b/frame/executive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-executive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,22 +13,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/tracing" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/tracing" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } [dev-dependencies] hex-literal = "0.2.1" -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } -pallet-indices = { version = "2.0.0-rc1", path = "../indices" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -pallet-transaction-payment = { version = "2.0.0-rc1", path = "../transaction-payment" } -sp-version = { version = "2.0.0-rc1", path = "../../primitives/version" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } +pallet-indices = { version = "2.0.0-rc2", path = "../indices" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +pallet-transaction-payment = { version = "2.0.0-rc2", path = "../transaction-payment" } +sp-version = { version = "2.0.0-rc2", path = "../../primitives/version" } [features] default = ["std"] diff --git a/frame/finality-tracker/Cargo.toml b/frame/finality-tracker/Cargo.toml index 02c15eebeb..248bf64432 100644 --- a/frame/finality-tracker/Cargo.toml +++ b/frame/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-finality-tracker" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,17 +16,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/finality-tracker" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-finality-tracker = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/finality-tracker" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/generic-asset/Cargo.toml b/frame/generic-asset/Cargo.toml index 4e2f85e890..11576aaeae 100644 --- a/frame/generic-asset/Cargo.toml +++ b/frame/generic-asset/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-generic-asset" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Centrality Developers "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/grandpa/Cargo.toml b/frame/grandpa/Cargo.toml index 9146b17a9e..78a86f23ff 100644 --- a/frame/grandpa/Cargo.toml +++ b/frame/grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-grandpa" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,27 +14,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-finality-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/finality-grandpa" } -sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/session" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } -pallet-finality-tracker = { version = "2.0.0-rc1", default-features = false, path = "../finality-tracker" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-finality-grandpa = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/finality-grandpa" } +sp-session = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/session" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc2", default-features = false, path = "../session" } +pallet-finality-tracker = { version = "2.0.0-rc2", default-features = false, path = "../finality-tracker" } [dev-dependencies] grandpa = { package = "finality-grandpa", version = "0.12.3", features = ["derive-codec"] } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -pallet-offences = { version = "2.0.0-rc1", path = "../offences" } -pallet-staking = { version = "2.0.0-rc1", path = "../staking" } -pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../timestamp" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +pallet-offences = { version = "2.0.0-rc2", path = "../offences" } +pallet-staking = { version = "2.0.0-rc2", path = "../staking" } +pallet-staking-reward-curve = { version = "2.0.0-rc2", path = "../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../timestamp" } [features] default = ["std"] diff --git a/frame/identity/Cargo.toml b/frame/identity/Cargo.toml index 5973f12988..d38b6c80f1 100644 --- a/frame/identity/Cargo.toml +++ b/frame/identity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-identity" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,16 +15,16 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/im-online/Cargo.toml b/frame/im-online/Cargo.toml index 29dc1af011..34b942c889 100644 --- a/frame/im-online/Cargo.toml +++ b/frame/im-online/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-im-online" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,20 +12,20 @@ description = "FRAME's I'm online pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } -pallet-authorship = { version = "2.0.0-rc1", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } +pallet-authorship = { version = "2.0.0-rc2", default-features = false, path = "../authorship" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../session" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc2", default-features = false, path = "../session" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [features] default = ["std", "pallet-session/historical"] diff --git a/frame/indices/Cargo.toml b/frame/indices/Cargo.toml index 32b5b81c64..d4217ca49c 100644 --- a/frame/indices/Cargo.toml +++ b/frame/indices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-indices" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-keyring = { version = "2.0.0-rc1", optional = true, path = "../../primitives/keyring" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-keyring = { version = "2.0.0-rc2", optional = true, path = "../../primitives/keyring" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/membership/Cargo.toml b/frame/membership/Cargo.toml index e881364579..21f55b900b 100644 --- a/frame/membership/Cargo.toml +++ b/frame/membership/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-membership" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/metadata/Cargo.toml b/frame/metadata/Cargo.toml index 71ae6858ee..4eac66ca5c 100644 --- a/frame/metadata/Cargo.toml +++ b/frame/metadata/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-metadata" -version = "11.0.0-rc1" +version = "11.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/nicks/Cargo.toml b/frame/nicks/Cargo.toml index 059e81408b..38952e6e94 100644 --- a/frame/nicks/Cargo.toml +++ b/frame/nicks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-nicks" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/offences/Cargo.toml b/frame/offences/Cargo.toml index 92770ba47b..260419741f 100644 --- a/frame/offences/Cargo.toml +++ b/frame/offences/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,18 +12,18 @@ description = "FRAME offences pallet" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } +pallet-balances = { version = "2.0.0-rc2", default-features = false, path = "../balances" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } serde = { version = "1.0.101", optional = true } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/offences/benchmarking/Cargo.toml b/frame/offences/benchmarking/Cargo.toml index c4564d6c82..f72036361b 100644 --- a/frame/offences/benchmarking/Cargo.toml +++ b/frame/offences/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-offences-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,27 +13,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../system" } -pallet-babe = { version = "2.0.0-rc1", default-features = false, path = "../../babe" } -pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../../balances" } -pallet-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../grandpa" } -pallet-im-online = { version = "2.0.0-rc1", default-features = false, path = "../../im-online" } -pallet-offences = { version = "2.0.0-rc1", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } -pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../../session" } -pallet-staking = { version = "2.0.0-rc1", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/staking" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../../system" } +pallet-babe = { version = "2.0.0-rc2", default-features = false, path = "../../babe" } +pallet-balances = { version = "2.0.0-rc2", default-features = false, path = "../../balances" } +pallet-grandpa = { version = "2.0.0-rc2", default-features = false, path = "../../grandpa" } +pallet-im-online = { version = "2.0.0-rc2", default-features = false, path = "../../im-online" } +pallet-offences = { version = "2.0.0-rc2", default-features = false, features = ["runtime-benchmarks"], path = "../../offences" } +pallet-session = { version = "2.0.0-rc2", default-features = false, path = "../../session" } +pallet-staking = { version = "2.0.0-rc2", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/staking" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } [dev-dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../../staking/reward-curve" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-rc2", path = "../../staking/reward-curve" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../../timestamp" } serde = { version = "1.0.101" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-io = { version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-io = { version = "2.0.0-rc2", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/frame/randomness-collective-flip/Cargo.toml b/frame/randomness-collective-flip/Cargo.toml index 7653d2256b..a539c295fe 100644 --- a/frame/randomness-collective-flip/Cargo.toml +++ b/frame/randomness-collective-flip/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-randomness-collective-flip" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] safe-mix = { version = "1.0", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } [features] default = ["std"] diff --git a/frame/recovery/Cargo.toml b/frame/recovery/Cargo.toml index 482cde4cd2..fe9e904fb3 100644 --- a/frame/recovery/Cargo.toml +++ b/frame/recovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-recovery" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,15 +15,15 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/scheduler/Cargo.toml b/frame/scheduler/Cargo.toml index e150d3b43b..79a1a89269 100644 --- a/frame/scheduler/Cargo.toml +++ b/frame/scheduler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scheduler" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Unlicense" @@ -11,16 +11,16 @@ description = "FRAME example pallet" [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.2.0", default-features = false } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core", default-features = false } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core", default-features = false } [features] default = ["std"] diff --git a/frame/scored-pool/Cargo.toml b/frame/scored-pool/Cargo.toml index e72e1bd1ad..4bee2eec30 100644 --- a/frame/scored-pool/Cargo.toml +++ b/frame/scored-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-scored-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/session/Cargo.toml b/frame/session/Cargo.toml index b653f2bd98..b79dc78f12 100644 --- a/frame/session/Cargo.toml +++ b/frame/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,20 +14,20 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/session" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../timestamp" } -sp-trie = { version = "2.0.0-rc1", optional = true, default-features = false, path = "../../primitives/trie" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-session = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/session" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../timestamp" } +sp-trie = { version = "2.0.0-rc2", optional = true, default-features = false, path = "../../primitives/trie" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../../primitives/application-crypto" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../../primitives/application-crypto" } lazy_static = "1.4.0" [features] diff --git a/frame/session/benchmarking/Cargo.toml b/frame/session/benchmarking/Cargo.toml index c8fa5d4453..1fe2438195 100644 --- a/frame/session/benchmarking/Cargo.toml +++ b/frame/session/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-session-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ description = "FRAME sessions pallet benchmarking" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../system" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../benchmarking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../support" } -pallet-staking = { version = "2.0.0-rc1", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } -pallet-session = { version = "2.0.0-rc1", default-features = false, path = "../../session" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../../system" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../../benchmarking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../support" } +pallet-staking = { version = "2.0.0-rc2", default-features = false, features = ["runtime-benchmarks"], path = "../../staking" } +pallet-session = { version = "2.0.0-rc2", default-features = false, path = "../../session" } [dev-dependencies] serde = { version = "1.0.101" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../../staking/reward-curve" } -sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../../timestamp" } -pallet-balances = { version = "2.0.0-rc1", path = "../../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +pallet-staking-reward-curve = { version = "2.0.0-rc2", path = "../../staking/reward-curve" } +sp-io ={ version = "2.0.0-rc2", path = "../../../primitives/io" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../../timestamp" } +pallet-balances = { version = "2.0.0-rc2", path = "../../balances" } [features] default = ["std"] diff --git a/frame/society/Cargo.toml b/frame/society/Cargo.toml index 41162f457c..25f596e9fd 100644 --- a/frame/society/Cargo.toml +++ b/frame/society/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-society" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,16 +14,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } rand_chacha = { version = "0.2", default-features = false } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/staking/Cargo.toml b/frame/staking/Cargo.toml index f6fa826a3d..916e5676da 100644 --- a/frame/staking/Cargo.toml +++ b/frame/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,29 +15,29 @@ targets = ["x86_64-unknown-linux-gnu"] static_assertions = "1.1.0" serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-phragmen = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/phragmen" } -sp-io ={ version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/staking" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-session = { version = "2.0.0-rc1", default-features = false, features = ["historical"], path = "../session" } -pallet-authorship = { version = "2.0.0-rc1", default-features = false, path = "../authorship" } -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-phragmen = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/phragmen" } +sp-io ={ version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/staking" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-session = { version = "2.0.0-rc2", default-features = false, features = ["historical"], path = "../session" } +pallet-authorship = { version = "2.0.0-rc2", default-features = false, path = "../authorship" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } # Optional imports for benchmarking -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } rand_chacha = { version = "0.2", default-features = false, optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../timestamp" } -pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../staking/reward-curve" } -substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } -frame-benchmarking = { version = "2.0.0-rc1", path = "../benchmarking" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-storage = { version = "2.0.0-rc2", path = "../../primitives/storage" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../timestamp" } +pallet-staking-reward-curve = { version = "2.0.0-rc2", path = "../staking/reward-curve" } +substrate-test-utils = { version = "2.0.0-rc2", path = "../../test-utils" } +frame-benchmarking = { version = "2.0.0-rc2", path = "../benchmarking" } rand_chacha = { version = "0.2" } parking_lot = "0.10.2" env_logger = "0.7.1" diff --git a/frame/staking/fuzzer/Cargo.lock b/frame/staking/fuzzer/Cargo.lock index b73462e2df..f6cb65aa5c 100644 --- a/frame/staking/fuzzer/Cargo.lock +++ b/frame/staking/fuzzer/Cargo.lock @@ -1763,7 +1763,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/frame/staking/fuzzer/Cargo.toml b/frame/staking/fuzzer/Cargo.toml index edd3037a7e..f4a31ff11a 100644 --- a/frame/staking/fuzzer/Cargo.toml +++ b/frame/staking/fuzzer/Cargo.toml @@ -15,19 +15,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] honggfuzz = "0.5" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -pallet-staking = { version = "2.0.0-rc1", path = "..", features = ["runtime-benchmarks"] } -pallet-staking-reward-curve = { version = "2.0.0-rc1", path = "../reward-curve" } -pallet-session = { version = "2.0.0-rc1", path = "../../session" } -pallet-indices = { version = "2.0.0-rc1", path = "../../indices" } -pallet-balances = { version = "2.0.0-rc1", path = "../../balances" } -pallet-timestamp = { version = "2.0.0-rc1", path = "../../timestamp" } -frame-system = { version = "2.0.0-rc1", path = "../../system" } -frame-support = { version = "2.0.0-rc1", path = "../../support" } -sp-std = { version = "2.0.0-rc1", path = "../../../primitives/std" } -sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-phragmen = { version = "2.0.0-rc1", path = "../../../primitives/phragmen" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +pallet-staking = { version = "2.0.0-rc2", path = "..", features = ["runtime-benchmarks"] } +pallet-staking-reward-curve = { version = "2.0.0-rc2", path = "../reward-curve" } +pallet-session = { version = "2.0.0-rc2", path = "../../session" } +pallet-indices = { version = "2.0.0-rc2", path = "../../indices" } +pallet-balances = { version = "2.0.0-rc2", path = "../../balances" } +pallet-timestamp = { version = "2.0.0-rc2", path = "../../timestamp" } +frame-system = { version = "2.0.0-rc2", path = "../../system" } +frame-support = { version = "2.0.0-rc2", path = "../../support" } +sp-std = { version = "2.0.0-rc2", path = "../../../primitives/std" } +sp-io ={ version = "2.0.0-rc2", path = "../../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-phragmen = { version = "2.0.0-rc2", path = "../../../primitives/phragmen" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } [[bin]] name = "submit_solution" diff --git a/frame/staking/reward-curve/Cargo.toml b/frame/staking/reward-curve/Cargo.toml index 3e6e4ca738..582f8d79f3 100644 --- a/frame/staking/reward-curve/Cargo.toml +++ b/frame/staking/reward-curve/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-staking-reward-curve" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -21,4 +21,4 @@ proc-macro2 = "1.0.6" proc-macro-crate = "0.1.4" [dev-dependencies] -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } diff --git a/frame/sudo/Cargo.toml b/frame/sudo/Cargo.toml index f6df3ec03e..979eeb2b28 100644 --- a/frame/sudo/Cargo.toml +++ b/frame/sudo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-sudo" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,14 +14,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index ba98adb8fc..d9117cf526 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,25 +15,25 @@ targets = ["x86_64-unknown-linux-gnu"] log = "0.4" serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-metadata = { version = "11.0.0-rc1", default-features = false, path = "../metadata" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-tracing = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/tracing" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-arithmetic = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/arithmetic" } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -frame-support-procedural = { version = "2.0.0-rc1", path = "./procedural" } +frame-metadata = { version = "11.0.0-rc2", default-features = false, path = "../metadata" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-tracing = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/tracing" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-arithmetic = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/arithmetic" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +frame-support-procedural = { version = "2.0.0-rc2", path = "./procedural" } paste = "0.1.6" once_cell = { version = "1", default-features = false, optional = true } -sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-rc2", optional = true, path = "../../primitives/state-machine" } bitmask = { version = "0.5.0", default-features = false } impl-trait-for-tuples = "0.1.3" smallvec = "1.4.0" [dev-dependencies] pretty_assertions = "0.6.1" -frame-system = { version = "2.0.0-rc1", path = "../system" } +frame-system = { version = "2.0.0-rc2", path = "../system" } [features] default = ["std"] diff --git a/frame/support/procedural/Cargo.toml b/frame/support/procedural/Cargo.toml index 90c90f4ca0..0c20ac93e1 100644 --- a/frame/support/procedural/Cargo.toml +++ b/frame/support/procedural/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -frame-support-procedural-tools = { version = "2.0.0-rc1", path = "./tools" } +frame-support-procedural-tools = { version = "2.0.0-rc2", path = "./tools" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full"] } diff --git a/frame/support/procedural/tools/Cargo.toml b/frame/support/procedural/tools/Cargo.toml index 2f6d124063..052a074024 100644 --- a/frame/support/procedural/tools/Cargo.toml +++ b/frame/support/procedural/tools/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Proc macro helpers for procedural macros" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-support-procedural-tools-derive = { version = "2.0.0-rc1", path = "./derive" } +frame-support-procedural-tools-derive = { version = "2.0.0-rc2", path = "./derive" } proc-macro2 = "1.0.6" quote = "1.0.3" syn = { version = "1.0.7", features = ["full", "visit"] } diff --git a/frame/support/procedural/tools/derive/Cargo.toml b/frame/support/procedural/tools/derive/Cargo.toml index 20d427de47..75cb6f3045 100644 --- a/frame/support/procedural/tools/derive/Cargo.toml +++ b/frame/support/procedural/tools/derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-procedural-tools-derive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 8b858cf5b0..6685f65551 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-support-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,12 +14,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io", default-features = false } -sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../../primitives/state-machine" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../" } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/inherents" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../../primitives/io", default-features = false } +sp-state-machine = { version = "0.8.0-rc2", optional = true, path = "../../../primitives/state-machine" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/inherents" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/core" } trybuild = "1.0.17" pretty_assertions = "0.6.1" rustversion = "1.0.0" diff --git a/frame/system/Cargo.toml b/frame/system/Cargo.toml index b88553729d..0928951929 100644 --- a/frame/system/Cargo.toml +++ b/frame/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io", default-features = false } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/version" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io", default-features = false } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-version = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/version" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] criterion = "0.2.11" -sp-externalities = { version = "0.8.0-rc1", path = "../../primitives/externalities" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../test-utils/runtime/client" } +sp-externalities = { version = "0.8.0-rc2", path = "../../primitives/externalities" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../test-utils/runtime/client" } [features] default = ["std"] diff --git a/frame/system/benchmarking/Cargo.toml b/frame/system/benchmarking/Cargo.toml index 748dc31467..14fb5206fe 100644 --- a/frame/system/benchmarking/Cargo.toml +++ b/frame/system/benchmarking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-benchmarking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/runtime" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../../benchmarking" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../system" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../support" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/runtime" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../../benchmarking" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../../system" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../support" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../../primitives/core" } [dev-dependencies] serde = { version = "1.0.101" } -sp-io ={ version = "2.0.0-rc1", path = "../../../primitives/io" } +sp-io ={ version = "2.0.0-rc2", path = "../../../primitives/io" } [features] default = ["std"] diff --git a/frame/system/rpc/runtime-api/Cargo.toml b/frame/system/rpc/runtime-api/Cargo.toml index 72e2837037..ef1cc7abac 100644 --- a/frame/system/rpc/runtime-api/Cargo.toml +++ b/frame/system/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-system-rpc-runtime-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "Runtime API definition required by System RPC extensions." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [features] diff --git a/frame/timestamp/Cargo.toml b/frame/timestamp/Cargo.toml index 6146700cd5..cda7904f75 100644 --- a/frame/timestamp/Cargo.toml +++ b/frame/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-timestamp" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,19 +16,19 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io", optional = true } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/timestamp" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io", optional = true } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/timestamp" } impl-trait-for-tuples = "0.1.3" [dev-dependencies] -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/transaction-payment/Cargo.toml b/frame/transaction-payment/Cargo.toml index e4af397388..17e05fa40f 100644 --- a/frame/transaction-payment/Cargo.toml +++ b/frame/transaction-payment/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,18 +13,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "./rpc/runtime-api" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc2", default-features = false, path = "./rpc/runtime-api" } smallvec = "1.4.0" [dev-dependencies] -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +sp-storage = { version = "2.0.0-rc2", path = "../../primitives/storage" } [features] default = ["std"] diff --git a/frame/transaction-payment/rpc/Cargo.toml b/frame/transaction-payment/rpc/Cargo.toml index e3e935c3c8..3ca2f4be8e 100644 --- a/frame/transaction-payment/rpc/Cargo.toml +++ b/frame/transaction-payment/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,10 +16,10 @@ codec = { package = "parity-scale-codec", version = "1.3.0" } jsonrpc-core = "14.0.3" jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sp-rpc = { version = "2.0.0-rc1", path = "../../../primitives/rpc" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sp-rpc = { version = "2.0.0-rc2", path = "../../../primitives/rpc" } serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc1", path = "./runtime-api" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +pallet-transaction-payment-rpc-runtime-api = { version = "2.0.0-rc2", path = "./runtime-api" } diff --git a/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/frame/transaction-payment/rpc/runtime-api/Cargo.toml index 4466a2e53d..e4be938b3d 100644 --- a/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-transaction-payment-rpc-runtime-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/api" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/api" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../../support" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../../support" } [dev-dependencies] serde_json = "1.0.41" diff --git a/frame/treasury/Cargo.toml b/frame/treasury/Cargo.toml index a78037ebe0..17c716fdcd 100644 --- a/frame/treasury/Cargo.toml +++ b/frame/treasury/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-treasury" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,17 +14,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -pallet-balances = { version = "2.0.0-rc1", default-features = false, path = "../balances" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +pallet-balances = { version = "2.0.0-rc2", default-features = false, path = "../balances" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io ={ version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } +sp-io ={ version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } [features] default = ["std"] diff --git a/frame/utility/Cargo.toml b/frame/utility/Cargo.toml index b6c7fffdaa..769e94c1bd 100644 --- a/frame/utility/Cargo.toml +++ b/frame/utility/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-utility" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,18 +14,18 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } [features] default = ["std"] diff --git a/frame/vesting/Cargo.toml b/frame/vesting/Cargo.toml index 311fd5ae40..314abd08d0 100644 --- a/frame/vesting/Cargo.toml +++ b/frame/vesting/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-vesting" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,17 +15,17 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.101", optional = true } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.6.2" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../support" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../system" } -frame-benchmarking = { version = "2.0.0-rc1", default-features = false, path = "../benchmarking", optional = true } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../support" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../system" } +frame-benchmarking = { version = "2.0.0-rc2", default-features = false, path = "../benchmarking", optional = true } [dev-dependencies] -sp-io = { version = "2.0.0-rc1", path = "../../primitives/io" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -pallet-balances = { version = "2.0.0-rc1", path = "../balances" } -sp-storage = { version = "2.0.0-rc1", path = "../../primitives/storage" } +sp-io = { version = "2.0.0-rc2", path = "../../primitives/io" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +pallet-balances = { version = "2.0.0-rc2", path = "../balances" } +sp-storage = { version = "2.0.0-rc2", path = "../../primitives/storage" } hex-literal = "0.2.1" [features] diff --git a/primitives/allocator/Cargo.toml b/primitives/allocator/Cargo.toml index e83d70b4dc..7bf9ffd43f 100644 --- a/primitives/allocator/Cargo.toml +++ b/primitives/allocator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-allocator" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,9 +13,9 @@ documentation = "https://docs.rs/sp-allocator" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-rc1", path = "../std", default-features = false } -sp-core = { version = "2.0.0-rc1", path = "../core", default-features = false } -sp-wasm-interface = { version = "2.0.0-rc1", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-rc2", path = "../std", default-features = false } +sp-core = { version = "2.0.0-rc2", path = "../core", default-features = false } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../wasm-interface", default-features = false } log = { version = "0.4.8", optional = true } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index f38da4da0c..980049235c 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,16 +13,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-api-proc-macro = { version = "2.0.0-rc1", path = "proc-macro" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } -sp-version = { version = "2.0.0-rc1", default-features = false, path = "../version" } -sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../primitives/state-machine" } +sp-api-proc-macro = { version = "2.0.0-rc2", path = "proc-macro" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } +sp-version = { version = "2.0.0-rc2", default-features = false, path = "../version" } +sp-state-machine = { version = "0.8.0-rc2", optional = true, path = "../../primitives/state-machine" } hash-db = { version = "0.15.2", optional = true } [dev-dependencies] -sp-test-primitives = { version = "2.0.0-rc1", path = "../test-primitives" } +sp-test-primitives = { version = "2.0.0-rc2", path = "../test-primitives" } [features] default = [ "std" ] diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index c0441de584..ce53ee9970 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-proc-macro" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/api/test/Cargo.toml b/primitives/api/test/Cargo.toml index 0760472b77..59b1e76ad9 100644 --- a/primitives/api/test/Cargo.toml +++ b/primitives/api/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-api-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,22 +12,22 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-rc1", path = "../" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } -sp-version = { version = "2.0.0-rc1", path = "../../version" } -sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../blockchain" } -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } +sp-api = { version = "2.0.0-rc2", path = "../" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } +sp-version = { version = "2.0.0-rc2", path = "../../version" } +sp-runtime = { version = "2.0.0-rc2", path = "../../runtime" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../blockchain" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../../client/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } trybuild = "1.0.17" rustversion = "1.0.0" [dev-dependencies] criterion = "0.3.0" -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } -sp-core = { version = "2.0.0-rc1", path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } +sp-core = { version = "2.0.0-rc2", path = "../../core" } [[bench]] name = "bench" diff --git a/primitives/application-crypto/Cargo.toml b/primitives/application-crypto/Cargo.toml index fa13fd947e..2da6b31627 100644 --- a/primitives/application-crypto/Cargo.toml +++ b/primitives/application-crypto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" description = "Provides facilities for generating application specific crypto wrapper types." @@ -14,11 +14,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } [features] default = [ "std" ] diff --git a/primitives/application-crypto/test/Cargo.toml b/primitives/application-crypto/test/Cargo.toml index 284af732a1..df7fc51698 100644 --- a/primitives/application-crypto/test/Cargo.toml +++ b/primitives/application-crypto/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-application-crypto-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" description = "Integration tests for application-crypto" @@ -13,8 +13,8 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../test-utils/runtime/client" } -sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../api" } -sp-application-crypto = { version = "2.0.0-rc1", path = "../" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../core" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../test-utils/runtime/client" } +sp-runtime = { version = "2.0.0-rc2", path = "../../runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../api" } +sp-application-crypto = { version = "2.0.0-rc2", path = "../" } diff --git a/primitives/arithmetic/Cargo.toml b/primitives/arithmetic/Cargo.toml index 50eab59c86..5953d89e9c 100644 --- a/primitives/arithmetic/Cargo.toml +++ b/primitives/arithmetic/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } integer-sqrt = "0.1.2" num-traits = { version = "0.2.8", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-debug-derive = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/debug-derive" } +sp-debug-derive = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/debug-derive" } [dev-dependencies] rand = "0.7.2" diff --git a/primitives/arithmetic/fuzzer/Cargo.toml b/primitives/arithmetic/fuzzer/Cargo.toml index c388d0259f..f870152f54 100644 --- a/primitives/arithmetic/fuzzer/Cargo.toml +++ b/primitives/arithmetic/fuzzer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-arithmetic-fuzzer" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-arithmetic = { version = "2.0.0-rc1", path = ".." } +sp-arithmetic = { version = "2.0.0-rc2", path = ".." } honggfuzz = "0.5.49" primitive-types = "0.7.0" num-bigint = "0.2" diff --git a/primitives/authority-discovery/Cargo.toml b/primitives/authority-discovery/Cargo.toml index 5d3db31f8a..24fcb91396 100644 --- a/primitives/authority-discovery/Cargo.toml +++ b/primitives/authority-discovery/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authority-discovery" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Authority discovery primitives" edition = "2018" @@ -12,11 +12,11 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", default-features = false, version = "1.3.0" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/authorship/Cargo.toml b/primitives/authorship/Cargo.toml index f28f5b6efe..5ae5561a59 100644 --- a/primitives/authorship/Cargo.toml +++ b/primitives/authorship/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-authorship" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Authorship primitives" edition = "2018" @@ -12,9 +12,9 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../inherents" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/block-builder/Cargo.toml b/primitives/block-builder/Cargo.toml index 565caffe9d..767dfeb87e 100644 --- a/primitives/block-builder/Cargo.toml +++ b/primitives/block-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-block-builder" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "The block builder runtime api." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../inherents" } [features] default = [ "std" ] diff --git a/primitives/blockchain/Cargo.toml b/primitives/blockchain/Cargo.toml index 36d13f0cec..d76d9c7209 100644 --- a/primitives/blockchain/Cargo.toml +++ b/primitives/blockchain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-blockchain" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,7 +19,7 @@ lru = "0.4.0" parking_lot = "0.10.0" derive_more = "0.99.2" codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-consensus = { version = "0.8.0-rc1", path = "../consensus/common" } -sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } -sp-block-builder = { version = "2.0.0-rc1", path = "../block-builder" } -sp-state-machine = { version = "0.8.0-rc1", path = "../state-machine" } +sp-consensus = { version = "0.8.0-rc2", path = "../consensus/common" } +sp-runtime = { version = "2.0.0-rc2", path = "../runtime" } +sp-block-builder = { version = "2.0.0-rc2", path = "../block-builder" } +sp-state-machine = { version = "0.8.0-rc2", path = "../state-machine" } diff --git a/primitives/chain-spec/Cargo.toml b/primitives/chain-spec/Cargo.toml index d530592fec..9b2658abe5 100644 --- a/primitives/chain-spec/Cargo.toml +++ b/primitives/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-chain-spec" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/consensus/aura/Cargo.toml b/primitives/consensus/aura/Cargo.toml index 9323788300..b270bdb476 100644 --- a/primitives/consensus/aura/Cargo.toml +++ b/primitives/consensus/aura/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-aura" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,13 +12,13 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../api" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../inherents" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../api" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../runtime" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../inherents" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/babe/Cargo.toml b/primitives/consensus/babe/Cargo.toml index 3a92b2f2c6..6cda2695d9 100644 --- a/primitives/consensus/babe/Cargo.toml +++ b/primitives/consensus/babe/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-babe" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Primitives for BABE consensus" edition = "2018" @@ -12,16 +12,16 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } merlin = { version = "2.0", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../api" } -sp-consensus = { version = "0.8.0-rc1", optional = true, path = "../common" } -sp-consensus-vrf = { version = "0.8.0-rc1", path = "../vrf", default-features = false } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../inherents" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } -sp-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../timestamp" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../std" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../api" } +sp-consensus = { version = "0.8.0-rc2", optional = true, path = "../common" } +sp-consensus-vrf = { version = "0.8.0-rc2", path = "../vrf", default-features = false } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../inherents" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../runtime" } +sp-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../timestamp" } [features] default = ["std"] diff --git a/primitives/consensus/common/Cargo.toml b/primitives/consensus/common/Cargo.toml index a652569895..f91ed927b9 100644 --- a/primitives/consensus/common/Cargo.toml +++ b/primitives/consensus/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,22 +17,22 @@ targets = ["x86_64-unknown-linux-gnu"] derive_more = "0.99.2" libp2p = { version = "0.19.1", default-features = false } log = "0.4.8" -sp-core = { path= "../../core", version = "2.0.0-rc1"} -sp-inherents = { version = "2.0.0-rc1", path = "../../inherents" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +sp-core = { path= "../../core", version = "2.0.0-rc2"} +sp-inherents = { version = "2.0.0-rc2", path = "../../inherents" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } futures = { version = "0.3.1", features = ["thread-pool"] } futures-timer = "3.0.1" -sp-std = { version = "2.0.0-rc1", path = "../../std" } -sp-version = { version = "2.0.0-rc1", path = "../../version" } -sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } -sp-utils = { version = "2.0.0-rc1", path = "../../utils" } +sp-std = { version = "2.0.0-rc2", path = "../../std" } +sp-version = { version = "2.0.0-rc2", path = "../../version" } +sp-runtime = { version = "2.0.0-rc2", path = "../../runtime" } +sp-utils = { version = "2.0.0-rc2", path = "../../utils" } codec = { package = "parity-scale-codec", version = "1.3.0", features = ["derive"] } parking_lot = "0.10.0" serde = { version = "1.0", features = ["derive"] } -prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc1"} +prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus", version = "0.8.0-rc2"} [dev-dependencies] -sp-test-primitives = { version = "2.0.0-rc1", path = "../../test-primitives" } +sp-test-primitives = { version = "2.0.0-rc2", path = "../../test-primitives" } [features] default = [] diff --git a/primitives/consensus/pow/Cargo.toml b/primitives/consensus/pow/Cargo.toml index 8ac24db410..d696b0a975 100644 --- a/primitives/consensus/pow/Cargo.toml +++ b/primitives/consensus/pow/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-pow" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Primitives for Aura consensus" edition = "2018" @@ -12,10 +12,10 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../api" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../api" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../runtime" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/primitives/consensus/vrf/Cargo.toml b/primitives/consensus/vrf/Cargo.toml index cb4b270744..3e0f3c8c3f 100644 --- a/primitives/consensus/vrf/Cargo.toml +++ b/primitives/consensus/vrf/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-consensus-vrf" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Primitives for VRF based consensus" edition = "2018" @@ -14,9 +14,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { version = "1.0.0", package = "parity-scale-codec", default-features = false } schnorrkel = { version = "0.9.1", features = ["preaudit_deprecated", "u64_backend"], default-features = false } -sp-std = { version = "2.0.0-rc1", path = "../../std", default-features = false } -sp-core = { version = "2.0.0-rc1", path = "../../core", default-features = false } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../runtime" } +sp-std = { version = "2.0.0-rc2", path = "../../std", default-features = false } +sp-core = { version = "2.0.0-rc2", path = "../../core", default-features = false } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../runtime" } [features] default = ["std"] diff --git a/primitives/core/Cargo.toml b/primitives/core/Cargo.toml index 85564274b0..1c06163843 100644 --- a/primitives/core/Cargo.toml +++ b/primitives/core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-core" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] derive_more = "0.99.2" -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } log = { version = "0.4.8", default-features = false } serde = { version = "1.0.101", optional = true, features = ["derive"] } @@ -33,9 +33,9 @@ num-traits = { version = "0.2.8", default-features = false } zeroize = { version = "1.0.0", default-features = false } lazy_static = { version = "1.4.0", default-features = false, optional = true } parking_lot = { version = "0.10.0", optional = true } -sp-debug-derive = { version = "2.0.0-rc1", path = "../debug-derive" } -sp-externalities = { version = "0.8.0-rc1", optional = true, path = "../externalities" } -sp-storage = { version = "2.0.0-rc1", default-features = false, path = "../storage" } +sp-debug-derive = { version = "2.0.0-rc2", path = "../debug-derive" } +sp-externalities = { version = "0.8.0-rc2", optional = true, path = "../externalities" } +sp-storage = { version = "2.0.0-rc2", default-features = false, path = "../storage" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } futures = { version = "0.3.1", optional = true } @@ -50,10 +50,10 @@ twox-hash = { version = "1.5.0", default-features = false, optional = true } libsecp256k1 = { version = "0.3.2", default-features = false, features = ["hmac"], optional = true } merlin = { version = "2.0", default-features = false, optional = true } -sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../runtime-interface" } +sp-runtime-interface = { version = "2.0.0-rc2", default-features = false, path = "../runtime-interface" } [dev-dependencies] -sp-serializer = { version = "2.0.0-rc1", path = "../serializer" } +sp-serializer = { version = "2.0.0-rc2", path = "../serializer" } pretty_assertions = "0.6.1" hex-literal = "0.2.1" rand = "0.7.2" diff --git a/primitives/database/Cargo.toml b/primitives/database/Cargo.toml index 5754227632..1899ec850d 100644 --- a/primitives/database/Cargo.toml +++ b/primitives/database/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-database" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/debug-derive/Cargo.toml b/primitives/debug-derive/Cargo.toml index a703dcc5f1..92ba01b23c 100644 --- a/primitives/debug-derive/Cargo.toml +++ b/primitives/debug-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-debug-derive" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/externalities/Cargo.toml b/primitives/externalities/Cargo.toml index 66367b7e79..589c8e625c 100644 --- a/primitives/externalities/Cargo.toml +++ b/primitives/externalities/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-externalities" -version = "0.8.0-rc1" +version = "0.8.0-rc2" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -13,7 +13,7 @@ documentation = "https://docs.rs/sp-externalities" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-storage = { version = "2.0.0-rc1", path = "../storage" } -sp-std = { version = "2.0.0-rc1", path = "../std" } +sp-storage = { version = "2.0.0-rc2", path = "../storage" } +sp-std = { version = "2.0.0-rc2", path = "../std" } environmental = { version = "1.1.1" } codec = { package = "parity-scale-codec", version = "1.3.0" } diff --git a/primitives/finality-grandpa/Cargo.toml b/primitives/finality-grandpa/Cargo.toml index a4154caac0..83bfca378d 100644 --- a/primitives/finality-grandpa/Cargo.toml +++ b/primitives/finality-grandpa/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-grandpa" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } grandpa = { package = "finality-grandpa", version = "0.12.3", default-features = false, features = ["derive-codec"] } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/finality-tracker/Cargo.toml b/primitives/finality-tracker/Cargo.toml index c8e663455d..2f9e377f6b 100644 --- a/primitives/finality-tracker/Cargo.toml +++ b/primitives/finality-tracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-finality-tracker" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } [features] default = ["std"] diff --git a/primitives/inherents/Cargo.toml b/primitives/inherents/Cargo.toml index 57434a2a7d..367782ae5b 100644 --- a/primitives/inherents/Cargo.toml +++ b/primitives/inherents/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-inherents" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] parking_lot = { version = "0.10.0", optional = true } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } derive_more = { version = "0.99.2", optional = true } diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml index ca12371406..6189194ede 100644 --- a/primitives/io/Cargo.toml +++ b/primitives/io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-io" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,14 +16,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } hash-db = { version = "0.15.2", default-features = false } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } libsecp256k1 = { version = "0.3.4", optional = true } -sp-state-machine = { version = "0.8.0-rc1", optional = true, path = "../../primitives/state-machine" } -sp-wasm-interface = { version = "2.0.0-rc1", path = "../../primitives/wasm-interface", default-features = false } -sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../runtime-interface" } -sp-trie = { version = "2.0.0-rc1", optional = true, path = "../../primitives/trie" } -sp-externalities = { version = "0.8.0-rc1", optional = true, path = "../externalities" } +sp-state-machine = { version = "0.8.0-rc2", optional = true, path = "../../primitives/state-machine" } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../../primitives/wasm-interface", default-features = false } +sp-runtime-interface = { version = "2.0.0-rc2", default-features = false, path = "../runtime-interface" } +sp-trie = { version = "2.0.0-rc2", optional = true, path = "../../primitives/trie" } +sp-externalities = { version = "0.8.0-rc2", optional = true, path = "../externalities" } log = { version = "0.4.8", optional = true } futures = { version = "0.3.1", features = ["thread-pool"], optional = true } parking_lot = { version = "0.10.0", optional = true } diff --git a/primitives/keyring/Cargo.toml b/primitives/keyring/Cargo.toml index b096e6d6c1..ead618e3fc 100644 --- a/primitives/keyring/Cargo.toml +++ b/primitives/keyring/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-keyring" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-rc1", path = "../core" } -sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sp-core = { version = "2.0.0-rc2", path = "../core" } +sp-runtime = { version = "2.0.0-rc2", path = "../runtime" } lazy_static = "1.4.0" strum = { version = "0.16.0", features = ["derive"] } diff --git a/primitives/offchain/Cargo.toml b/primitives/offchain/Cargo.toml index eb9e319869..2f7246121a 100644 --- a/primitives/offchain/Cargo.toml +++ b/primitives/offchain/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Substrate offchain workers primitives" name = "sp-offchain" -version = "2.0.0-rc1" +version = "2.0.0-rc2" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } [dev-dependencies] -sp-state-machine = { version = "0.8.0-rc1", default-features = false, path = "../state-machine" } +sp-state-machine = { version = "0.8.0-rc2", default-features = false, path = "../state-machine" } [features] default = ["std"] diff --git a/primitives/panic-handler/Cargo.toml b/primitives/panic-handler/Cargo.toml index 886f979311..75042799b1 100644 --- a/primitives/panic-handler/Cargo.toml +++ b/primitives/panic-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-panic-handler" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/Cargo.toml b/primitives/phragmen/Cargo.toml index 021c60325c..d2b8e56dc0 100644 --- a/primitives/phragmen/Cargo.toml +++ b/primitives/phragmen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -14,15 +14,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.0.0", default-features = false, features = ["derive"] } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-phragmen-compact = { version = "2.0.0-rc1", path = "./compact" } -sp-arithmetic = { version = "2.0.0-rc1", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-phragmen-compact = { version = "2.0.0-rc2", path = "./compact" } +sp-arithmetic = { version = "2.0.0-rc2", default-features = false, path = "../arithmetic" } [dev-dependencies] -substrate-test-utils = { version = "2.0.0-rc1", path = "../../test-utils" } +substrate-test-utils = { version = "2.0.0-rc2", path = "../../test-utils" } rand = "0.7.3" -sp-phragmen = { version = "2.0.0-rc1", path = "." } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } +sp-phragmen = { version = "2.0.0-rc2", path = "." } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } [features] default = ["std"] diff --git a/primitives/phragmen/compact/Cargo.toml b/primitives/phragmen/compact/Cargo.toml index c3f8748a9d..8fb9789d99 100644 --- a/primitives/phragmen/compact/Cargo.toml +++ b/primitives/phragmen/compact/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-phragmen-compact" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/phragmen/fuzzer/Cargo.lock b/primitives/phragmen/fuzzer/Cargo.lock index 19f8114f36..a57bfa3920 100644 --- a/primitives/phragmen/fuzzer/Cargo.lock +++ b/primitives/phragmen/fuzzer/Cargo.lock @@ -1247,7 +1247,7 @@ dependencies = [ [[package]] name = "sp-phragmen-compact" -version = "2.0.0-rc1" +version = "2.0.0-rc2" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/primitives/phragmen/fuzzer/Cargo.toml b/primitives/phragmen/fuzzer/Cargo.toml index 82f33c173d..2846841e1c 100644 --- a/primitives/phragmen/fuzzer/Cargo.toml +++ b/primitives/phragmen/fuzzer/Cargo.toml @@ -14,9 +14,9 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-phragmen = { version = "2.0.0-rc1", path = ".." } -sp-std = { version = "2.0.0-rc1", path = "../../std" } -sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } +sp-phragmen = { version = "2.0.0-rc2", path = ".." } +sp-std = { version = "2.0.0-rc2", path = "../../std" } +sp-runtime = { version = "2.0.0-rc2", path = "../../runtime" } honggfuzz = "0.5" rand = { version = "0.7.3", features = ["std", "small_rng"] } diff --git a/primitives/rpc/Cargo.toml b/primitives/rpc/Cargo.toml index 2b476bd872..a625d4ad71 100644 --- a/primitives/rpc/Cargo.toml +++ b/primitives/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-rpc" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", features = ["derive"] } -sp-core = { version = "2.0.0-rc1", path = "../core" } +sp-core = { version = "2.0.0-rc2", path = "../core" } [dev-dependencies] serde_json = "1.0.41" diff --git a/primitives/runtime-interface/Cargo.toml b/primitives/runtime-interface/Cargo.toml index 0f78b410e3..a0ff633014 100644 --- a/primitives/runtime-interface/Cargo.toml +++ b/primitives/runtime-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,20 +13,20 @@ documentation = "https://docs.rs/sp-runtime-interface/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-wasm-interface = { version = "2.0.0-rc1", path = "../wasm-interface", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-tracing = { version = "2.0.0-rc1", default-features = false, path = "../tracing" } -sp-runtime-interface-proc-macro = { version = "2.0.0-rc1", path = "proc-macro" } -sp-externalities = { version = "0.8.0-rc1", optional = true, path = "../externalities" } +sp-wasm-interface = { version = "2.0.0-rc2", path = "../wasm-interface", default-features = false } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-tracing = { version = "2.0.0-rc2", default-features = false, path = "../tracing" } +sp-runtime-interface-proc-macro = { version = "2.0.0-rc2", path = "proc-macro" } +sp-externalities = { version = "0.8.0-rc2", optional = true, path = "../externalities" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } static_assertions = "1.0.0" primitive-types = { version = "0.7.0", default-features = false } [dev-dependencies] -sp-runtime-interface-test-wasm = { version = "2.0.0-rc1", path = "test-wasm" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } -sp-core = { version = "2.0.0-rc1", path = "../core" } -sp-io = { version = "2.0.0-rc1", path = "../io" } +sp-runtime-interface-test-wasm = { version = "2.0.0-rc2", path = "test-wasm" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-rc2", path = "../core" } +sp-io = { version = "2.0.0-rc2", path = "../io" } rustversion = "1.0.0" trybuild = "1.0.23" diff --git a/primitives/runtime-interface/proc-macro/Cargo.toml b/primitives/runtime-interface/proc-macro/Cargo.toml index 4ea3fce0be..89d8ddf56b 100644 --- a/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/primitives/runtime-interface/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-proc-macro" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml index 99baf624a5..43a1f8baa9 100644 --- a/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml +++ b/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm-deprecated" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-rc2", default-features = false, path = "../" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test-wasm/Cargo.toml b/primitives/runtime-interface/test-wasm/Cargo.toml index ce236ae16c..3f99e157ec 100644 --- a/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/primitives/runtime-interface/test-wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test-wasm" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,10 +13,10 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-rc1", default-features = false, path = "../" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../io" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../core" } +sp-runtime-interface = { version = "2.0.0-rc2", default-features = false, path = "../" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../io" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../core" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../../utils/wasm-builder-runner" } diff --git a/primitives/runtime-interface/test/Cargo.toml b/primitives/runtime-interface/test/Cargo.toml index efd474dc93..b281278b5c 100644 --- a/primitives/runtime-interface/test/Cargo.toml +++ b/primitives/runtime-interface/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime-interface-test" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ repository = "https://github.com/paritytech/substrate/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-runtime-interface = { version = "2.0.0-rc1", path = "../" } -sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } -sp-runtime-interface-test-wasm = { version = "2.0.0-rc1", path = "../test-wasm" } -sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-rc1", path = "../test-wasm-deprecated" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } -sp-runtime = { version = "2.0.0-rc1", path = "../../runtime" } -sp-core = { version = "2.0.0-rc1", path = "../../core" } -sp-io = { version = "2.0.0-rc1", path = "../../io" } +sp-runtime-interface = { version = "2.0.0-rc2", path = "../" } +sc-executor = { version = "0.8.0-rc2", path = "../../../client/executor" } +sp-runtime-interface-test-wasm = { version = "2.0.0-rc2", path = "../test-wasm" } +sp-runtime-interface-test-wasm-deprecated = { version = "2.0.0-rc2", path = "../test-wasm-deprecated" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } +sp-runtime = { version = "2.0.0-rc2", path = "../../runtime" } +sp-core = { version = "2.0.0-rc2", path = "../../core" } +sp-io = { version = "2.0.0-rc2", path = "../../io" } tracing = "0.1.13" diff --git a/primitives/runtime/Cargo.toml b/primitives/runtime/Cargo.toml index 3c5fdde12b..ae30372b65 100644 --- a/primitives/runtime/Cargo.toml +++ b/primitives/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -16,23 +16,23 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } -sp-arithmetic = { version = "2.0.0-rc1", default-features = false, path = "../arithmetic" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../io" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../application-crypto" } +sp-arithmetic = { version = "2.0.0-rc2", default-features = false, path = "../arithmetic" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../io" } log = { version = "0.4.8", optional = true } paste = "0.1.6" rand = { version = "0.7.2", optional = true } impl-trait-for-tuples = "0.1.3" -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../inherents" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } hash256-std-hasher = { version = "0.15.2", default-features = false } [dev-dependencies] serde_json = "1.0.41" rand = "0.7.2" -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } [features] bench = [] diff --git a/primitives/sandbox/Cargo.toml b/primitives/sandbox/Cargo.toml index d5e3113511..522ce1ea62 100755 --- a/primitives/sandbox/Cargo.toml +++ b/primitives/sandbox/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-sandbox" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,10 +13,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../io" } -sp-wasm-interface = { version = "2.0.0-rc1", default-features = false, path = "../wasm-interface" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../io" } +sp-wasm-interface = { version = "2.0.0-rc2", default-features = false, path = "../wasm-interface" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } [dev-dependencies] diff --git a/primitives/serializer/Cargo.toml b/primitives/serializer/Cargo.toml index ad57cdda4b..4fa0f215d3 100644 --- a/primitives/serializer/Cargo.toml +++ b/primitives/serializer/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-serializer" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/session/Cargo.toml b/primitives/session/Cargo.toml index 656db4ec92..48defdbe64 100644 --- a/primitives/session/Cargo.toml +++ b/primitives/session/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-session" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,11 +13,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-staking = { version = "2.0.0-rc1", default-features = false, path = "../staking" } -sp-runtime = { version = "2.0.0-rc1", optional = true, path = "../runtime" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-staking = { version = "2.0.0-rc2", default-features = false, path = "../staking" } +sp-runtime = { version = "2.0.0-rc2", optional = true, path = "../runtime" } [features] default = [ "std" ] diff --git a/primitives/staking/Cargo.toml b/primitives/staking/Cargo.toml index 75fbb0020c..7f6019958c 100644 --- a/primitives/staking/Cargo.toml +++ b/primitives/staking/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-staking" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -13,8 +13,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } [features] default = ["std"] diff --git a/primitives/state-machine/Cargo.toml b/primitives/state-machine/Cargo.toml index b8ce048b2e..6a2653bb5b 100644 --- a/primitives/state-machine/Cargo.toml +++ b/primitives/state-machine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-state-machine" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Substrate State Machine" edition = "2018" @@ -18,17 +18,17 @@ parking_lot = "0.10.0" hash-db = "0.15.2" trie-db = "0.20.1" trie-root = "0.16.0" -sp-trie = { version = "2.0.0-rc1", path = "../trie" } -sp-core = { version = "2.0.0-rc1", path = "../core" } -sp-panic-handler = { version = "2.0.0-rc1", path = "../panic-handler" } +sp-trie = { version = "2.0.0-rc2", path = "../trie" } +sp-core = { version = "2.0.0-rc2", path = "../core" } +sp-panic-handler = { version = "2.0.0-rc2", path = "../panic-handler" } codec = { package = "parity-scale-codec", version = "1.3.0" } num-traits = "0.2.8" rand = "0.7.2" -sp-externalities = { version = "0.8.0-rc1", path = "../externalities" } +sp-externalities = { version = "0.8.0-rc2", path = "../externalities" } [dev-dependencies] hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../runtime" } [features] default = [] diff --git a/primitives/std/Cargo.toml b/primitives/std/Cargo.toml index d7ed5615ae..3f08366fa8 100644 --- a/primitives/std/Cargo.toml +++ b/primitives/std/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-std" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/storage/Cargo.toml b/primitives/storage/Cargo.toml index 94db0a4f4d..d0d45649c4 100644 --- a/primitives/storage/Cargo.toml +++ b/primitives/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-storage" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" description = "Storage related primitives" @@ -13,11 +13,11 @@ documentation = "https://docs.rs/sp-storage/" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } serde = { version = "1.0.101", optional = true, features = ["derive"] } impl-serde = { version = "0.2.3", optional = true } ref-cast = "1.0.0" -sp-debug-derive = { version = "2.0.0-rc1", path = "../debug-derive" } +sp-debug-derive = { version = "2.0.0-rc2", path = "../debug-derive" } [features] default = [ "std" ] diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index 707b049533..ec050b7428 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-test-primitives" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../application-crypto" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../application-crypto" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } serde = { version = "1.0.101", optional = true, features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } [features] diff --git a/primitives/timestamp/Cargo.toml b/primitives/timestamp/Cargo.toml index 570c878f7d..4e8d2cabcb 100644 --- a/primitives/timestamp/Cargo.toml +++ b/primitives/timestamp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-timestamp" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,11 +12,11 @@ description = "Substrate core types and inherents for timestamps." targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../inherents" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../inherents" } impl-trait-for-tuples = "0.1.3" wasm-timer = { version = "0.2", optional = true } diff --git a/primitives/tracing/Cargo.toml b/primitives/tracing/Cargo.toml index 13c5d1c25c..213af27572 100644 --- a/primitives/tracing/Cargo.toml +++ b/primitives/tracing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-tracing" -version = "2.0.0-rc1" +version = "2.0.0-rc2" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" diff --git a/primitives/transaction-pool/Cargo.toml b/primitives/transaction-pool/Cargo.toml index 312fb71353..dbb21f34b6 100644 --- a/primitives/transaction-pool/Cargo.toml +++ b/primitives/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-transaction-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -19,9 +19,9 @@ derive_more = { version = "0.99.2", optional = true } futures = { version = "0.3.1", optional = true } log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", features = ["derive"], optional = true} -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../api" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } -sp-utils = { version = "2.0.0-rc1", default-features = false, path = "../utils" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../api" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } +sp-utils = { version = "2.0.0-rc2", default-features = false, path = "../utils" } [features] default = [ "std" ] diff --git a/primitives/trie/Cargo.toml b/primitives/trie/Cargo.toml index 8eacd4a628..57a2cb59ec 100644 --- a/primitives/trie/Cargo.toml +++ b/primitives/trie/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-trie" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] description = "Patricia trie stuff using a parity-scale-codec node format" repository = "https://github.com/paritytech/substrate/" @@ -18,19 +18,19 @@ harness = false [dependencies] codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } hash-db = { version = "0.15.2", default-features = false } trie-db = { version = "0.20.1", default-features = false } trie-root = { version = "0.16.0", default-features = false } memory-db = { version = "0.20.0", default-features = false } -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../core" } +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../core" } [dev-dependencies] trie-bench = "0.21.0" trie-standardmap = "0.15.2" criterion = "0.2.11" hex-literal = "0.2.1" -sp-runtime = { version = "2.0.0-rc1", path = "../runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../runtime" } [features] default = ["std"] diff --git a/primitives/utils/Cargo.toml b/primitives/utils/Cargo.toml index 6c5488f389..5f4e6c7181 100644 --- a/primitives/utils/Cargo.toml +++ b/primitives/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-utils" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/primitives/version/Cargo.toml b/primitives/version/Cargo.toml index 19a773d306..e442639f87 100644 --- a/primitives/version/Cargo.toml +++ b/primitives/version/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-version" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] impl-serde = { version = "0.2.3", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../std" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../runtime" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../std" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../runtime" } [features] default = ["std"] diff --git a/primitives/wasm-interface/Cargo.toml b/primitives/wasm-interface/Cargo.toml index d83a586827..dc00ef5ec0 100644 --- a/primitives/wasm-interface/Cargo.toml +++ b/primitives/wasm-interface/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-wasm-interface" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] wasmi = { version = "0.6.2", optional = true } impl-trait-for-tuples = "0.1.2" -sp-std = { version = "2.0.0-rc1", path = "../std", default-features = false } +sp-std = { version = "2.0.0-rc2", path = "../std", default-features = false } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } [features] diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index 4f6a46e145..0bb1d3026e 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-utils" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/test-utils/client/Cargo.toml b/test-utils/client/Cargo.toml index ae0dfb3808..a72dced392 100644 --- a/test-utils/client/Cargo.toml +++ b/test-utils/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-client" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,17 +12,17 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-rc1", path = "../../client/api" } -sc-client-db = { version = "0.8.0-rc1", features = ["test-helpers"], path = "../../client/db" } -sp-consensus = { version = "0.8.0-rc1", path = "../../primitives/consensus/common" } -sc-executor = { version = "0.8.0-rc1", path = "../../client/executor" } -sc-consensus = { version = "0.8.0-rc1", path = "../../client/consensus/common" } -sc-service = { version = "0.8.0-rc1", default-features = false, features = ["test-helpers"], path = "../../client/service" } +sc-client-api = { version = "2.0.0-rc2", path = "../../client/api" } +sc-client-db = { version = "0.8.0-rc2", features = ["test-helpers"], path = "../../client/db" } +sp-consensus = { version = "0.8.0-rc2", path = "../../primitives/consensus/common" } +sc-executor = { version = "0.8.0-rc2", path = "../../client/executor" } +sc-consensus = { version = "0.8.0-rc2", path = "../../client/consensus/common" } +sc-service = { version = "0.8.0-rc2", default-features = false, features = ["test-helpers"], path = "../../client/service" } futures = "0.3.4" hash-db = "0.15.2" -sp-keyring = { version = "2.0.0-rc1", path = "../../primitives/keyring" } +sp-keyring = { version = "2.0.0-rc2", path = "../../primitives/keyring" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-core = { version = "2.0.0-rc1", path = "../../primitives/core" } -sp-runtime = { version = "2.0.0-rc1", path = "../../primitives/runtime" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../primitives/blockchain" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sp-core = { version = "2.0.0-rc2", path = "../../primitives/core" } +sp-runtime = { version = "2.0.0-rc2", path = "../../primitives/runtime" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../primitives/blockchain" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } diff --git a/test-utils/runtime/Cargo.toml b/test-utils/runtime/Cargo.toml index 70e98b2466..cb529e1cb7 100644 --- a/test-utils/runtime/Cargo.toml +++ b/test-utils/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" build = "build.rs" @@ -13,35 +13,35 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-application-crypto = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/application-crypto" } -sp-consensus-aura = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/aura" } -sp-consensus-babe = { version = "0.8.0-rc1", default-features = false, path = "../../primitives/consensus/babe" } -sp-block-builder = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/block-builder" } +sp-application-crypto = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/application-crypto" } +sp-consensus-aura = { version = "0.8.0-rc2", default-features = false, path = "../../primitives/consensus/aura" } +sp-consensus-babe = { version = "0.8.0-rc2", default-features = false, path = "../../primitives/consensus/babe" } +sp-block-builder = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/block-builder" } codec = { package = "parity-scale-codec", version = "1.3.0", default-features = false, features = ["derive"] } -frame-executive = { version = "2.0.0-rc1", default-features = false, path = "../../frame/executive" } -sp-inherents = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/inherents" } -sp-keyring = { version = "2.0.0-rc1", optional = true, path = "../../primitives/keyring" } +frame-executive = { version = "2.0.0-rc2", default-features = false, path = "../../frame/executive" } +sp-inherents = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/inherents" } +sp-keyring = { version = "2.0.0-rc2", optional = true, path = "../../primitives/keyring" } memory-db = { version = "0.20.0", default-features = false } -sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-rc1"} -sp-core = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/core" } -sp-std = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/std" } -sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-rc1"} -sp-io = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/io" } -frame-support = { version = "2.0.0-rc1", default-features = false, path = "../../frame/support" } -sp-version = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/version" } -sp-session = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/session" } -sp-api = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/api" } -sp-runtime = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/runtime" } -pallet-babe = { version = "2.0.0-rc1", default-features = false, path = "../../frame/babe" } -frame-system = { version = "2.0.0-rc1", default-features = false, path = "../../frame/system" } -frame-system-rpc-runtime-api = { version = "2.0.0-rc1", default-features = false, path = "../../frame/system/rpc/runtime-api" } -pallet-timestamp = { version = "2.0.0-rc1", default-features = false, path = "../../frame/timestamp" } -sp-finality-grandpa = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/finality-grandpa" } -sp-trie = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/trie" } -sp-transaction-pool = { version = "2.0.0-rc1", default-features = false, path = "../../primitives/transaction-pool" } +sp-offchain = { path = "../../primitives/offchain", default-features = false, version = "2.0.0-rc2"} +sp-core = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/core" } +sp-std = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/std" } +sp-runtime-interface = { path = "../../primitives/runtime-interface", default-features = false, version = "2.0.0-rc2"} +sp-io = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/io" } +frame-support = { version = "2.0.0-rc2", default-features = false, path = "../../frame/support" } +sp-version = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/version" } +sp-session = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/session" } +sp-api = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/api" } +sp-runtime = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/runtime" } +pallet-babe = { version = "2.0.0-rc2", default-features = false, path = "../../frame/babe" } +frame-system = { version = "2.0.0-rc2", default-features = false, path = "../../frame/system" } +frame-system-rpc-runtime-api = { version = "2.0.0-rc2", default-features = false, path = "../../frame/system/rpc/runtime-api" } +pallet-timestamp = { version = "2.0.0-rc2", default-features = false, path = "../../frame/timestamp" } +sp-finality-grandpa = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/finality-grandpa" } +sp-trie = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/trie" } +sp-transaction-pool = { version = "2.0.0-rc2", default-features = false, path = "../../primitives/transaction-pool" } trie-db = { version = "0.20.1", default-features = false } parity-util-mem = { version = "0.6.1", default-features = false, features = ["primitive-types"] } -sc-service = { version = "0.8.0-rc1", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } +sc-service = { version = "0.8.0-rc2", default-features = false, optional = true, features = ["test-helpers"], path = "../../client/service" } # 3rd party cfg-if = "0.1.10" @@ -49,10 +49,10 @@ log = { version = "0.4.8", optional = true } serde = { version = "1.0.101", optional = true, features = ["derive"] } [dev-dependencies] -sc-block-builder = { version = "0.8.0-rc1", path = "../../client/block-builder" } -sc-executor = { version = "0.8.0-rc1", path = "../../client/executor" } -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "./client" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../primitives/state-machine" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../client/block-builder" } +sc-executor = { version = "0.8.0-rc2", path = "../../client/executor" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "./client" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../primitives/state-machine" } [build-dependencies] wasm-builder-runner = { version = "1.0.5", package = "substrate-wasm-builder-runner", path = "../../utils/wasm-builder-runner" } diff --git a/test-utils/runtime/client/Cargo.toml b/test-utils/runtime/client/Cargo.toml index 388a5e159b..51d89ed95d 100644 --- a/test-utils/runtime/client/Cargo.toml +++ b/test-utils/runtime/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-client" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,16 +12,16 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sp-consensus = { version = "0.8.0-rc1", path = "../../../primitives/consensus/common" } -sc-block-builder = { version = "0.8.0-rc1", path = "../../../client/block-builder" } -substrate-test-client = { version = "2.0.0-rc1", path = "../../client" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -substrate-test-runtime = { version = "2.0.0-rc1", path = "../../runtime" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../../primitives/api" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } +sp-consensus = { version = "0.8.0-rc2", path = "../../../primitives/consensus/common" } +sc-block-builder = { version = "0.8.0-rc2", path = "../../../client/block-builder" } +substrate-test-client = { version = "2.0.0-rc2", path = "../../client" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +substrate-test-runtime = { version = "2.0.0-rc2", path = "../../runtime" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../../primitives/api" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } codec = { package = "parity-scale-codec", version = "1.3.0" } -sc-client-api = { version = "2.0.0-rc1", path = "../../../client/api" } -sc-consensus = { version = "0.8.0-rc1", path = "../../../client/consensus/common" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../client/api" } +sc-consensus = { version = "0.8.0-rc2", path = "../../../client/consensus/common" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../../client/service" } futures = "0.3.4" diff --git a/test-utils/runtime/transaction-pool/Cargo.toml b/test-utils/runtime/transaction-pool/Cargo.toml index a240984883..171e864dc5 100644 --- a/test-utils/runtime/transaction-pool/Cargo.toml +++ b/test-utils/runtime/transaction-pool/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-test-runtime-transaction-pool" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,12 +12,12 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../client" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../client" } parking_lot = "0.10.0" codec = { package = "parity-scale-codec", version = "1.3.0" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../primitives/blockchain" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../primitives/transaction-pool" } -sc-transaction-graph = { version = "2.0.0-rc1", path = "../../../client/transaction-pool/graph" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../primitives/blockchain" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../primitives/transaction-pool" } +sc-transaction-graph = { version = "2.0.0-rc2", path = "../../../client/transaction-pool/graph" } futures = { version = "0.3.1", features = ["compat"] } derive_more = "0.99.2" diff --git a/utils/browser/Cargo.toml b/utils/browser/Cargo.toml index 6b15cf4346..0850b7b77e 100644 --- a/utils/browser/Cargo.toml +++ b/utils/browser/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-browser-utils" -version = "0.8.0-rc1" +version = "0.8.0-rc2" authors = ["Parity Technologies "] description = "Utilities for creating a browser light-client." edition = "2018" @@ -22,11 +22,11 @@ js-sys = "0.3.34" wasm-bindgen = "0.2.57" wasm-bindgen-futures = "0.4.7" kvdb-web = "0.6" -sp-database = { version = "2.0.0-rc1", path = "../../primitives/database" } -sc-informant = { version = "0.8.0-rc1", path = "../../client/informant" } -sc-service = { version = "0.8.0-rc1", path = "../../client/service", default-features = false } -sc-network = { path = "../../client/network", version = "0.8.0-rc1"} -sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-rc1"} +sp-database = { version = "2.0.0-rc2", path = "../../primitives/database" } +sc-informant = { version = "0.8.0-rc2", path = "../../client/informant" } +sc-service = { version = "0.8.0-rc2", path = "../../client/service", default-features = false } +sc-network = { path = "../../client/network", version = "0.8.0-rc2"} +sc-chain-spec = { path = "../../client/chain-spec", version = "2.0.0-rc2"} # Imported just for the `no_cc` feature clear_on_drop = { version = "0.2.3", features = ["no_cc"] } diff --git a/utils/build-script-utils/Cargo.toml b/utils/build-script-utils/Cargo.toml index 02a5e13c88..8e722d6919 100644 --- a/utils/build-script-utils/Cargo.toml +++ b/utils/build-script-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-build-script-utils" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/fork-tree/Cargo.toml b/utils/fork-tree/Cargo.toml index 357016cd2a..d07afd2d42 100644 --- a/utils/fork-tree/Cargo.toml +++ b/utils/fork-tree/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fork-tree" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" diff --git a/utils/frame/benchmarking-cli/Cargo.toml b/utils/frame/benchmarking-cli/Cargo.toml index 7a0be9ec55..d9a8dd67e7 100644 --- a/utils/frame/benchmarking-cli/Cargo.toml +++ b/utils/frame/benchmarking-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "frame-benchmarking-cli" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,15 +12,15 @@ description = "CLI for benchmarking FRAME" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -frame-benchmarking = { version = "2.0.0-rc1", path = "../../../frame/benchmarking" } -sp-core = { version = "2.0.0-rc1", path = "../../../primitives/core" } -sc-service = { version = "0.8.0-rc1", default-features = false, path = "../../../client/service" } -sc-cli = { version = "0.8.0-rc1", path = "../../../client/cli" } -sc-client-db = { version = "0.8.0-rc1", path = "../../../client/db" } -sc-executor = { version = "0.8.0-rc1", path = "../../../client/executor" } -sp-externalities = { version = "0.8.0-rc1", path = "../../../primitives/externalities" } -sp-runtime = { version = "2.0.0-rc1", path = "../../../primitives/runtime" } -sp-state-machine = { version = "0.8.0-rc1", path = "../../../primitives/state-machine" } +frame-benchmarking = { version = "2.0.0-rc2", path = "../../../frame/benchmarking" } +sp-core = { version = "2.0.0-rc2", path = "../../../primitives/core" } +sc-service = { version = "0.8.0-rc2", default-features = false, path = "../../../client/service" } +sc-cli = { version = "0.8.0-rc2", path = "../../../client/cli" } +sc-client-db = { version = "0.8.0-rc2", path = "../../../client/db" } +sc-executor = { version = "0.8.0-rc2", path = "../../../client/executor" } +sp-externalities = { version = "0.8.0-rc2", path = "../../../primitives/externalities" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../primitives/runtime" } +sp-state-machine = { version = "0.8.0-rc2", path = "../../../primitives/state-machine" } structopt = "0.3.8" codec = { version = "1.3.0", package = "parity-scale-codec" } diff --git a/utils/frame/rpc/support/Cargo.toml b/utils/frame/rpc/support/Cargo.toml index 14cf65742e..006372eb36 100644 --- a/utils/frame/rpc/support/Cargo.toml +++ b/utils/frame/rpc/support/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-support" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies ", "Andrew Dirksen "] edition = "2018" license = "Apache-2.0" @@ -17,10 +17,10 @@ jsonrpc-client-transports = { version = "14.0.5", default-features = false, feat jsonrpc-core = "14" codec = { package = "parity-scale-codec", version = "1" } serde = "1" -frame-support = { version = "2.0.0-rc1", path = "../../../../frame/support" } -sp-storage = { version = "2.0.0-rc1", path = "../../../../primitives/storage" } -sc-rpc-api = { version = "0.8.0-rc1", path = "../../../../client/rpc-api" } +frame-support = { version = "2.0.0-rc2", path = "../../../../frame/support" } +sp-storage = { version = "2.0.0-rc2", path = "../../../../primitives/storage" } +sc-rpc-api = { version = "0.8.0-rc2", path = "../../../../client/rpc-api" } [dev-dependencies] -frame-system = { version = "2.0.0-rc1", path = "../../../../frame/system" } +frame-system = { version = "2.0.0-rc2", path = "../../../../frame/system" } tokio = "0.2" diff --git a/utils/frame/rpc/system/Cargo.toml b/utils/frame/rpc/system/Cargo.toml index ed00809a3b..f757e811fb 100644 --- a/utils/frame/rpc/system/Cargo.toml +++ b/utils/frame/rpc/system/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substrate-frame-rpc-system" -version = "2.0.0-rc1" +version = "2.0.0-rc2" authors = ["Parity Technologies "] edition = "2018" license = "Apache-2.0" @@ -12,7 +12,7 @@ description = "FRAME's system exposed over Substrate RPC" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -sc-client-api = { version = "2.0.0-rc1", path = "../../../../client/api" } +sc-client-api = { version = "2.0.0-rc2", path = "../../../../client/api" } codec = { package = "parity-scale-codec", version = "1.3.0" } futures = { version = "0.3.4", features = ["compat"] } jsonrpc-core = "14.0.3" @@ -20,14 +20,14 @@ jsonrpc-core-client = "14.0.5" jsonrpc-derive = "14.0.3" log = "0.4.8" serde = { version = "1.0.101", features = ["derive"] } -sp-runtime = { version = "2.0.0-rc1", path = "../../../../primitives/runtime" } -sp-api = { version = "2.0.0-rc1", path = "../../../../primitives/api" } -frame-system-rpc-runtime-api = { version = "2.0.0-rc1", path = "../../../../frame/system/rpc/runtime-api" } -sp-core = { version = "2.0.0-rc1", path = "../../../../primitives/core" } -sp-blockchain = { version = "2.0.0-rc1", path = "../../../../primitives/blockchain" } -sp-transaction-pool = { version = "2.0.0-rc1", path = "../../../../primitives/transaction-pool" } +sp-runtime = { version = "2.0.0-rc2", path = "../../../../primitives/runtime" } +sp-api = { version = "2.0.0-rc2", path = "../../../../primitives/api" } +frame-system-rpc-runtime-api = { version = "2.0.0-rc2", path = "../../../../frame/system/rpc/runtime-api" } +sp-core = { version = "2.0.0-rc2", path = "../../../../primitives/core" } +sp-blockchain = { version = "2.0.0-rc2", path = "../../../../primitives/blockchain" } +sp-transaction-pool = { version = "2.0.0-rc2", path = "../../../../primitives/transaction-pool" } [dev-dependencies] -substrate-test-runtime-client = { version = "2.0.0-rc1", path = "../../../../test-utils/runtime/client" } +substrate-test-runtime-client = { version = "2.0.0-rc2", path = "../../../../test-utils/runtime/client" } env_logger = "0.7.0" -sc-transaction-pool = { version = "2.0.0-rc1", path = "../../../../client/transaction-pool" } +sc-transaction-pool = { version = "2.0.0-rc2", path = "../../../../client/transaction-pool" } diff --git a/utils/prometheus/Cargo.toml b/utils/prometheus/Cargo.toml index 697e186db6..d1f192f7b5 100644 --- a/utils/prometheus/Cargo.toml +++ b/utils/prometheus/Cargo.toml @@ -1,7 +1,7 @@ [package] description = "Endpoint to expose Prometheus metrics" name = "substrate-prometheus-endpoint" -version = "0.8.0-rc1" +version = "0.8.0-rc2" license = "Apache-2.0" authors = ["Parity Technologies "] edition = "2018" -- GitLab From bda3b4092681cc1ab95be4de71fe3a313721852a Mon Sep 17 00:00:00 2001 From: Marcio Diaz Date: Tue, 26 May 2020 18:03:29 +0200 Subject: [PATCH 122/150] Fix mul_acc. (#6145) --- primitives/arithmetic/src/fixed.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/primitives/arithmetic/src/fixed.rs b/primitives/arithmetic/src/fixed.rs index 5c87891432..bc657c5ede 100644 --- a/primitives/arithmetic/src/fixed.rs +++ b/primitives/arithmetic/src/fixed.rs @@ -75,6 +75,11 @@ pub trait FixedPointNumber: /// Consumes `self` and returns the inner raw value. fn into_inner(self) -> Self::Inner; + /// Returns the negation. + fn negate(self) -> Self { + Self::from_inner(-self.into_inner()) + } + /// Creates self from an integer number `int`. /// /// Returns `Self::max` or `Self::min` if `int` exceeds accuracy. @@ -163,7 +168,11 @@ pub trait FixedPointNumber: /// /// Returns `N::min` or `N::max` if the multiplication or final result does not fit in `N`. fn saturating_mul_acc_int(self, n: N) -> N { - self.saturating_mul_int(n).saturating_add(n) + if self.is_negative() && n > N::zero() { + n.saturating_sub(self.negate().saturating_mul_int(n)) + } else { + self.saturating_mul_int(n).saturating_add(n) + } } /// Saturating absolute value. @@ -1255,7 +1264,8 @@ macro_rules! implement_fixed { let a = $name::saturating_from_rational(-1, 2); assert_eq!(a.saturating_mul_acc_int(42i8), 21i8); - assert_eq!(a.saturating_mul_acc_int(u128::max_value() - 1), u128::max_value() - 1); + assert_eq!(a.saturating_mul_acc_int(42u8), 21u8); + assert_eq!(a.saturating_mul_acc_int(u128::max_value() - 1), u128::max_value() / 2); } #[test] -- GitLab From b3adec2288ff3f34d780c59cb68b5663f245ca96 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 26 May 2020 21:23:32 +0200 Subject: [PATCH 123/150] Don't iterate over peers in generic_proto::behaviour::poll (#6142) * Don't iterate over peers in generic_proto::behaviour::poll * Improve comment * Rework to use DelayIds --- .../src/protocol/generic_proto/behaviour.rs | 83 ++++++++++++++----- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/client/network/src/protocol/generic_proto/behaviour.rs b/client/network/src/protocol/generic_proto/behaviour.rs index b3c209eb0c..cf6188726d 100644 --- a/client/network/src/protocol/generic_proto/behaviour.rs +++ b/client/network/src/protocol/generic_proto/behaviour.rs @@ -126,6 +126,18 @@ pub struct GenericProto { /// List of peers in our state. peers: FnvHashMap, + /// The elements in `peers` occasionally contain `Delay` objects that we would normally have + /// to be polled one by one. In order to avoid doing so, as an optimization, every `Delay` is + /// instead put inside of `delays` and reference by a [`DelayId`]. This stream + /// yields `PeerId`s whose `DelayId` is potentially ready. + /// + /// By design, we never remove elements from this list. Elements are removed only when the + /// `Delay` triggers. As such, this stream may produce obsolete elements. + delays: stream::FuturesUnordered + Send>>>, + + /// [`DelayId`] to assign to the next delay. + next_delay_id: DelayId, + /// List of incoming messages we have sent to the peer set manager and that are waiting for an /// answer. incoming: SmallVec<[IncomingPeer; 6]>, @@ -141,6 +153,10 @@ pub struct GenericProto { queue_size_report: Option, } +/// Identifier for a delay firing. +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +struct DelayId(u64); + /// State of a peer we're connected to. #[derive(Debug)] enum PeerState { @@ -158,8 +174,8 @@ enum PeerState { /// The peerset requested that we connect to this peer. We are currently not connected. PendingRequest { - /// When to actually start dialing. - timer: futures_timer::Delay, + /// When to actually start dialing. References an entry in `delays`. + timer: DelayId, /// When the `timer` will trigger. timer_deadline: Instant, }, @@ -183,8 +199,8 @@ enum PeerState { DisabledPendingEnable { /// The connections that are currently open for custom protocol traffic. open: SmallVec<[ConnectionId; crate::MAX_CONNECTIONS_PER_PEER]>, - /// When to enable this remote. - timer: futures_timer::Delay, + /// When to enable this remote. References an entry in `delays`. + timer: DelayId, /// When the `timer` will trigger. timer_deadline: Instant, }, @@ -338,6 +354,8 @@ impl GenericProto { notif_protocols: Vec::new(), peerset, peers: FnvHashMap::default(), + delays: Default::default(), + next_delay_id: DelayId(0), incoming: SmallVec::new(), next_incoming_index: sc_peerset::IncomingIndex(0), events: VecDeque::new(), @@ -627,10 +645,20 @@ impl GenericProto { match mem::replace(occ_entry.get_mut(), PeerState::Poisoned) { PeerState::Banned { ref until } if *until > now => { + let peer_id = occ_entry.key().clone(); debug!(target: "sub-libp2p", "PSM => Connect({:?}): Will start to connect at \ - until {:?}", occ_entry.key(), until); + until {:?}", peer_id, until); + + let delay_id = self.next_delay_id; + self.next_delay_id.0 += 1; + let delay = futures_timer::Delay::new(*until - now); + self.delays.push(async move { + delay.await; + (delay_id, peer_id) + }.boxed()); + *occ_entry.into_mut() = PeerState::PendingRequest { - timer: futures_timer::Delay::new(*until - now), + timer: delay_id, timer_deadline: *until, }; }, @@ -649,11 +677,21 @@ impl GenericProto { open, banned_until: Some(ref banned) } if *banned > now => { + let peer_id = occ_entry.key().clone(); debug!(target: "sub-libp2p", "PSM => Connect({:?}): But peer is banned until {:?}", - occ_entry.key(), banned); + peer_id, banned); + + let delay_id = self.next_delay_id; + self.next_delay_id.0 += 1; + let delay = futures_timer::Delay::new(*banned - now); + self.delays.push(async move { + delay.await; + (delay_id, peer_id) + }.boxed()); + *occ_entry.into_mut() = PeerState::DisabledPendingEnable { open, - timer: futures_timer::Delay::new(*banned - now), + timer: delay_id, timer_deadline: *banned, }; }, @@ -1363,34 +1401,37 @@ impl NetworkBehaviour for GenericProto { } } - for (peer_id, peer_state) in self.peers.iter_mut() { - match peer_state { - PeerState::PendingRequest { timer, .. } => { - if let Poll::Pending = Pin::new(timer).poll(cx) { - continue; - } + while let Poll::Ready(Some((delay_id, peer_id))) = + Pin::new(&mut self.delays).poll_next(cx) { + let peer_state = match self.peers.get_mut(&peer_id) { + Some(s) => s, + // We intentionally never remove elements from `delays`, and it may + // thus contain peers which are now gone. This is a normal situation. + None => continue, + }; + match peer_state { + PeerState::PendingRequest { timer, .. } if *timer == delay_id => { debug!(target: "sub-libp2p", "Libp2p <= Dial {:?} now that ban has expired", peer_id); self.events.push_back(NetworkBehaviourAction::DialPeer { - peer_id: peer_id.clone(), + peer_id, condition: DialPeerCondition::Disconnected }); *peer_state = PeerState::Requested; } - PeerState::DisabledPendingEnable { timer, open, .. } => { - if let Poll::Pending = Pin::new(timer).poll(cx) { - continue; - } - + PeerState::DisabledPendingEnable { timer, open, .. } if *timer == delay_id => { debug!(target: "sub-libp2p", "Handler({:?}) <= Enable (ban expired)", peer_id); self.events.push_back(NetworkBehaviourAction::NotifyHandler { - peer_id: peer_id.clone(), + peer_id, handler: NotifyHandler::All, event: NotifsHandlerIn::Enable, }); *peer_state = PeerState::Enabled { open: mem::replace(open, Default::default()) }; } + + // We intentionally never remove elements from `delays`, and it may + // thus contain obsolete entries. This is a normal situation. _ => {}, } } -- GitLab From dee1bfbd0ab45e76d3257c8786830525839afea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 26 May 2020 21:23:57 +0200 Subject: [PATCH 124/150] Fixes `wasm-builder` rerun if changed logic (#6144) There was a bug which related in required files not being tracked of being modified. This pr fixes this bug by making sure we ignore version requirements for path dependencies and git dependencies. This also ensures that we only track `.rs` or `.toml` files. Another improvement is that we only include paths which don't contain a `Cargo.toml` if this `Cargo.toml` does not belongs to the package being processed. This prevents that sub-crates are added to the tracked files, while not being part of the dependencies. --- Cargo.lock | 12 ++-- utils/wasm-builder/Cargo.toml | 4 +- utils/wasm-builder/src/wasm_project.rs | 77 ++++++++++++++++---------- 3 files changed, 55 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f3c9672e37..ac74b57a52 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -520,9 +520,9 @@ checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" [[package]] name = "cargo_metadata" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e3374c604fb39d1a2f35ed5e4a4e30e60d01fab49446e08f1b3e9a90aef202" +checksum = "b8de60b887edf6d74370fc8eb177040da4847d971d6234c7b13a6da324ef0caf" dependencies = [ "semver 0.9.0", "serde", @@ -7021,18 +7021,18 @@ checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" [[package]] name = "serde" -version = "1.0.106" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" +checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.106" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" +checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" dependencies = [ "proc-macro2", "quote 1.0.3", diff --git a/utils/wasm-builder/Cargo.toml b/utils/wasm-builder/Cargo.toml index 2b7a632b55..74e5f20524 100644 --- a/utils/wasm-builder/Cargo.toml +++ b/utils/wasm-builder/Cargo.toml @@ -14,10 +14,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] build-helper = "0.1.1" -cargo_metadata = "0.9.0" +cargo_metadata = "0.10.0" tempfile = "3.1.0" toml = "0.5.4" -walkdir = "2.2.9" +walkdir = "2.3.1" fs2 = "0.4.3" wasm-gc-api = "0.1.11" atty = "0.2.13" diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index d1c926c904..69dbc7882b 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -26,7 +26,7 @@ use toml::value::Table; use build_helper::rerun_if_changed; -use cargo_metadata::MetadataCommand; +use cargo_metadata::{MetadataCommand, Metadata}; use walkdir::WalkDir; @@ -342,11 +342,7 @@ fn project_enabled_features( /// /// # Returns /// The path to the created project. -fn create_project( - cargo_manifest: &Path, - wasm_workspace: &Path, - crate_metadata: &cargo_metadata::Metadata, -) -> PathBuf { +fn create_project(cargo_manifest: &Path, wasm_workspace: &Path, crate_metadata: &Metadata) -> PathBuf { let crate_name = get_crate_name(cargo_manifest); let crate_path = cargo_manifest.parent().expect("Parent path exists; qed"); let wasm_binary = get_wasm_binary_name(cargo_manifest); @@ -519,22 +515,33 @@ fn generate_rerun_if_changed_instructions( .exec() .expect("`cargo metadata` can not fail!"); - // Start with the dependencies of the crate we want to compile for wasm. - let mut dependencies = metadata.packages + let package = metadata.packages .iter() .find(|p| p.manifest_path == cargo_manifest) - .expect("The crate package is contained in its own metadata; qed") - .dependencies - .iter() - .collect::>(); + .expect("The crate package is contained in its own metadata; qed"); + + // Start with the dependencies of the crate we want to compile for wasm. + let mut dependencies = package.dependencies.iter().collect::>(); // Collect all packages by follow the dependencies of all packages we find. let mut packages = HashSet::new(); + packages.insert(DeduplicatePackage::from(package)); + while let Some(dependency) = dependencies.pop() { + let path_or_git_dep = dependency.source + .as_ref() + .map(|s| s.starts_with("git+")) + .unwrap_or(true); + let package = metadata.packages .iter() .filter(|p| !p.manifest_path.starts_with(wasm_workspace)) - .find(|p| dependency.req.matches(&p.version) && dependency.name == p.name); + .find(|p| { + // Check that the name matches and that the version matches or this is + // a git or path dep. A git or path dependency can only occur once, so we don't + // need to check the version. + (path_or_git_dep || dependency.req.matches(&p.version)) && dependency.name == p.name + }); if let Some(package) = package { if packages.insert(DeduplicatePackage::from(package)) { @@ -544,21 +551,7 @@ fn generate_rerun_if_changed_instructions( } // Make sure that if any file/folder of a dependency change, we need to rerun the `build.rs` - packages.into_iter() - .filter(|p| !p.manifest_path.starts_with(wasm_workspace)) - .for_each(|package| { - let mut manifest_path = package.manifest_path.clone(); - if manifest_path.ends_with("Cargo.toml") { - manifest_path.pop(); - } - - rerun_if_changed(&manifest_path); - - WalkDir::new(manifest_path) - .into_iter() - .filter_map(|p| p.ok()) - .for_each(|p| rerun_if_changed(p.path())); - }); + packages.iter().for_each(package_rerun_if_changed); // Register our env variables println!("cargo:rerun-if-env-changed={}", crate::SKIP_BUILD_ENV); @@ -568,8 +561,32 @@ fn generate_rerun_if_changed_instructions( println!("cargo:rerun-if-env-changed={}", crate::WASM_BUILD_TOOLCHAIN); } -/// Copy the WASM binary to the target directory set in `WASM_TARGET_DIRECTORY` environment variable. -/// If the variable is not set, this is a no-op. +/// Track files and paths related to the given package to rerun `build.rs` on any relevant change. +fn package_rerun_if_changed(package: &DeduplicatePackage) { + let mut manifest_path = package.manifest_path.clone(); + if manifest_path.ends_with("Cargo.toml") { + manifest_path.pop(); + } + + WalkDir::new(&manifest_path) + .into_iter() + .filter_entry(|p| { + // Ignore this entry if it is a directory that contains a `Cargo.toml` that is not the + // `Cargo.toml` related to the current package. This is done to ignore sub-crates of a crate. + // If such a sub-crate is a dependency, it will be processed independently anyway. + p.path() == manifest_path + || !p.path().is_dir() + || !p.path().join("Cargo.toml").exists() + }) + .filter_map(|p| p.ok().map(|p| p.into_path())) + .filter(|p| { + p.is_dir() || p.extension().map(|e| e == "rs" || e == "toml").unwrap_or_default() + }) + .for_each(|p| rerun_if_changed(p)); +} + +/// Copy the WASM binary to the target directory set in `WASM_TARGET_DIRECTORY` environment +/// variable. If the variable is not set, this is a no-op. fn copy_wasm_to_target_directory(cargo_manifest: &Path, wasm_binary: &WasmBinary) { let target_dir = match env::var(crate::WASM_TARGET_DIRECTORY) { Ok(path) => PathBuf::from(path), -- GitLab From 4fd3ee18ff973a8357e701ca590ad5a182bea395 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 26 May 2020 21:25:15 +0200 Subject: [PATCH 125/150] CLI: Make `--dev` conflict with `--chain` (#6146) If we are running `--dev` chain, we should forbid the `--chain` argument. The `--dev` chain is always special by only having one authority etc and some other chain spec is probably not setup for this correctly. In the end `--dev` is just a shortcut for `--validator --alice`. --- client/cli/src/commands/run_cmd.rs | 2 +- client/cli/src/params/shared_params.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/cli/src/commands/run_cmd.rs b/client/cli/src/commands/run_cmd.rs index f87d5bea6e..23a410d679 100644 --- a/client/cli/src/commands/run_cmd.rs +++ b/client/cli/src/commands/run_cmd.rs @@ -65,7 +65,7 @@ pub struct RunCmd { pub sentry: Vec, /// Disable GRANDPA voter when running in validator mode, otherwise disable the GRANDPA observer. - #[structopt(long = "no-grandpa")] + #[structopt(long)] pub no_grandpa: bool, /// Experimental: Run in light client mode. diff --git a/client/cli/src/params/shared_params.rs b/client/cli/src/params/shared_params.rs index 5bf8102466..e9440f38a1 100644 --- a/client/cli/src/params/shared_params.rs +++ b/client/cli/src/params/shared_params.rs @@ -23,16 +23,16 @@ use structopt::StructOpt; #[derive(Debug, StructOpt, Clone)] pub struct SharedParams { /// Specify the chain specification (one of dev, local, or staging). - #[structopt(long = "chain", value_name = "CHAIN_SPEC")] + #[structopt(long, value_name = "CHAIN_SPEC")] pub chain: Option, /// Specify the development chain. - #[structopt(long = "dev")] + #[structopt(long, conflicts_with_all = &["chain"])] pub dev: bool, /// Specify custom base path. #[structopt( - long = "base-path", + long, short = "d", value_name = "PATH", parse(from_os_str) @@ -43,7 +43,7 @@ pub struct SharedParams { /// /// Log levels (least to most verbose) are error, warn, info, debug, and trace. /// By default, all targets log `info`. The global log level can be set with -l. - #[structopt(short = "l", long = "log", value_name = "LOG_PATTERN")] + #[structopt(short = "l", long, value_name = "LOG_PATTERN")] pub log: Vec, } -- GitLab From 91f8cedbea8fb6ea7956e1192f40806eaacbe4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Wed, 27 May 2020 00:28:41 +0200 Subject: [PATCH 126/150] Make `wasm-builder` check before copy/write files if the content is the same (#6149) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make `wasm-builder` check before copy/write files if the content is the same * Update utils/wasm-builder/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> --- utils/wasm-builder/src/lib.rs | 11 +++++++++++ utils/wasm-builder/src/wasm_project.rs | 7 +++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/utils/wasm-builder/src/lib.rs b/utils/wasm-builder/src/lib.rs index 9f9e77275a..a4c546c802 100644 --- a/utils/wasm-builder/src/lib.rs +++ b/utils/wasm-builder/src/lib.rs @@ -185,6 +185,17 @@ fn write_file_if_changed(file: PathBuf, content: String) { } } +/// Copy `src` to `dst` if the `dst` does not exist or is different. +fn copy_file_if_changed(src: PathBuf, dst: PathBuf) { + let src_file = fs::read_to_string(&src).ok(); + let dst_file = fs::read_to_string(&dst).ok(); + + if src_file != dst_file { + fs::copy(&src, &dst) + .expect(&format!("Copying `{}` to `{}` can not fail; qed", src.display(), dst.display())); + } +} + /// Get a cargo command that compiles with nightly fn get_nightly_cargo() -> CargoCommand { let env_cargo = CargoCommand::new( diff --git a/utils/wasm-builder/src/wasm_project.rs b/utils/wasm-builder/src/wasm_project.rs index 69dbc7882b..4e927f4e85 100644 --- a/utils/wasm-builder/src/wasm_project.rs +++ b/utils/wasm-builder/src/wasm_project.rs @@ -302,10 +302,10 @@ fn create_wasm_workspace_project(wasm_workspace: &Path, workspace_root_path: &Pa wasm_workspace_toml.insert("patch".into(), patch.into()); } - fs::write( + write_file_if_changed( wasm_workspace.join("Cargo.toml"), toml::to_string_pretty(&wasm_workspace_toml).expect("Wasm workspace toml is valid; qed"), - ).expect("WASM workspace `Cargo.toml` writing can not fail; qed"); + ); } /// Get a list of enabled features for the project. @@ -382,8 +382,7 @@ fn create_project(cargo_manifest: &Path, wasm_workspace: &Path, crate_metadata: if let Some(crate_lock_file) = find_cargo_lock(cargo_manifest) { // Use the `Cargo.lock` of the main project. - fs::copy(crate_lock_file, wasm_workspace.join("Cargo.lock")) - .expect("Copying the `Cargo.lock` can not fail; qed"); + crate::copy_file_if_changed(crate_lock_file, wasm_workspace.join("Cargo.lock")); } project_folder -- GitLab From 8e3c4aae984c3539fb25f86eb8b1ed6cc7960140 Mon Sep 17 00:00:00 2001 From: Xiliang Chen Date: Wed, 27 May 2020 20:18:53 +1200 Subject: [PATCH 127/150] fix lstrip in biguint (#6151) * add failing test for multiply_by_rational * fix BigUint * fix length * bump version * merge tests --- bin/node/runtime/src/lib.rs | 2 +- primitives/arithmetic/src/biguint.rs | 10 +++++----- primitives/arithmetic/src/rational128.rs | 9 +++++++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 67e988f496..a3723f049a 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -94,7 +94,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. spec_version: 251, - impl_version: 0, + impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, }; diff --git a/primitives/arithmetic/src/biguint.rs b/primitives/arithmetic/src/biguint.rs index a1e5ea2666..41e2c759a5 100644 --- a/primitives/arithmetic/src/biguint.rs +++ b/primitives/arithmetic/src/biguint.rs @@ -151,7 +151,7 @@ impl BigUint { // has the ability to cause this. There is nothing to do if the number already has 1 // limb only. call it a day and return. if self.len().is_zero() { return; } - let index = self.digits.iter().position(|&elem| elem != 0).unwrap_or(0); + let index = self.digits.iter().position(|&elem| elem != 0).unwrap_or(self.len() - 1); if index > 0 { self.digits = self.digits[index..].to_vec() @@ -581,19 +581,19 @@ pub mod tests { fn strip_works() { let mut a = BigUint::from_limbs(&[0, 1, 0]); a.lstrip(); - assert_eq!(a, BigUint { digits: vec![1, 0] }); + assert_eq!(a.digits, vec![1, 0]); let mut a = BigUint::from_limbs(&[0, 0, 1]); a.lstrip(); - assert_eq!(a, BigUint { digits: vec![1] }); + assert_eq!(a.digits, vec![1]); let mut a = BigUint::from_limbs(&[0, 0]); a.lstrip(); - assert_eq!(a, BigUint { digits: vec![0] }); + assert_eq!(a.digits, vec![0]); let mut a = BigUint::from_limbs(&[0, 0, 0]); a.lstrip(); - assert_eq!(a, BigUint { digits: vec![0] }); + assert_eq!(a.digits, vec![0]); } #[test] diff --git a/primitives/arithmetic/src/rational128.rs b/primitives/arithmetic/src/rational128.rs index 9d0d10921d..709af1d3b9 100644 --- a/primitives/arithmetic/src/rational128.rs +++ b/primitives/arithmetic/src/rational128.rs @@ -360,6 +360,15 @@ mod tests { multiply_by_rational(1_000_000_000, MAX128 / 8, MAX128 / 2).unwrap(), 250000000, ); + + assert_eq!( + multiply_by_rational( + 29459999999999999988000u128, + 1000000000000000000u128, + 10000000000000000000u128 + ).unwrap(), + 2945999999999999998800u128 + ); } #[test] -- GitLab From d166fcf2028b223a00d9c329898baf981a574008 Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 27 May 2020 14:10:04 +0300 Subject: [PATCH 128/150] remover ancient code (#6157) --- bin/node/cli/src/service.rs | 77 ------------------------------------- 1 file changed, 77 deletions(-) diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index b738b5cf1f..05f168bd8b 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -432,83 +432,6 @@ mod tests { type AccountPublic = ::Signer; - #[cfg(feature = "rhd")] - fn test_sync() { - use sp_core::ed25519::Pair; - - use {service_test, Factory}; - use sp_consensus::{BlockImportParams, BlockOrigin}; - - let alice: Arc = Arc::new(Keyring::Alice.into()); - let bob: Arc = Arc::new(Keyring::Bob.into()); - let validators = vec![alice.public().0.into(), bob.public().0.into()]; - let keys: Vec<&ed25519::Pair> = vec![&*alice, &*bob]; - let dummy_runtime = ::tokio::runtime::Runtime::new().unwrap(); - let block_factory = |service: &::FullService| { - let block_id = BlockId::number(service.client().chain_info().best_number); - let parent_header = service.client().best_header(&block_id) - .expect("db error") - .expect("best block should exist"); - - futures::executor::block_on( - service.transaction_pool().maintain( - ChainEvent::NewBlock { - is_new_best: true, - id: block_id.clone(), - retracted: vec![], - header: parent_header, - }, - ) - ); - - let consensus_net = ConsensusNetwork::new(service.network(), service.client().clone()); - let proposer_factory = consensus::ProposerFactory { - client: service.client().clone(), - transaction_pool: service.transaction_pool().clone(), - network: consensus_net, - force_delay: 0, - handle: dummy_runtime.executor(), - }; - let (proposer, _, _) = proposer_factory.init(&parent_header, &validators, alice.clone()).unwrap(); - let block = proposer.propose().expect("Error making test block"); - BlockImportParams { - origin: BlockOrigin::File, - justification: Vec::new(), - internal_justification: Vec::new(), - finalized: false, - body: Some(block.extrinsics), - storage_changes: None, - header: block.header, - auxiliary: Vec::new(), - } - }; - let extrinsic_factory = - |service: &SyncService<::FullService>| - { - let payload = ( - 0, - Call::Balances(BalancesCall::transfer(RawAddress::Id(bob.public().0.into()), 69.into())), - Era::immortal(), - service.client().genesis_hash() - ); - let signature = alice.sign(&payload.encode()).into(); - let id = alice.public().0.into(); - let xt = UncheckedExtrinsic { - signature: Some((RawAddress::Id(id), signature, payload.0, Era::immortal())), - function: payload.1, - }.encode(); - let v: Vec = Decode::decode(&mut xt.as_slice()).unwrap(); - OpaqueExtrinsic(v) - }; - sc_service_test::sync( - sc_chain_spec::integration_test_config(), - |config| new_full(config), - |mut config| new_light(config), - block_factory, - extrinsic_factory, - ); - } - #[test] // It is "ignored", but the node-cli ignored tests are running on the CI. // This can be run locally with `cargo test --release -p node-cli test_sync -- --ignored`. -- GitLab From 4b09788469bc7dfbf1858bd1d435bee512f6021d Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 27 May 2020 13:11:09 +0200 Subject: [PATCH 129/150] Add subkey inspect-node-key (#6153) --- bin/utils/subkey/src/main.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bin/utils/subkey/src/main.rs b/bin/utils/subkey/src/main.rs index 898e99f062..4153e769c9 100644 --- a/bin/utils/subkey/src/main.rs +++ b/bin/utils/subkey/src/main.rs @@ -267,6 +267,9 @@ fn get_app<'a, 'b>(usage: &'a str) -> App<'a, 'b> { If the value is a file, the file content is used as URI. \ If not given, you will be prompted for the URI.' "), + SubCommand::with_name("inspect-node-key") + .about("Print the peer ID corresponding to the node key in the given file") + .args_from_usage("[file] 'Name of file to read the secret key from'"), SubCommand::with_name("sign") .about("Sign a message, provided on STDIN, with a given (secret) key") .args_from_usage(" @@ -439,6 +442,17 @@ where ("inspect", Some(matches)) => { C::print_from_uri(&get_uri("uri", &matches)?, password, maybe_network, output); } + ("inspect-node-key", Some(matches)) => { + let file = matches.value_of("file").ok_or(Error::Static("Input file name is required"))?; + + let mut file_content = fs::read(file)?; + let secret = libp2p_ed25519::SecretKey::from_bytes(&mut file_content) + .map_err(|_| Error::Static("Bad node key file"))?; + let keypair = libp2p_ed25519::Keypair::from(secret); + let peer_id = PublicKey::Ed25519(keypair.public()).into_peer_id(); + + println!("{}", peer_id); + } ("sign", Some(matches)) => { let suri = get_uri("suri", &matches)?; let should_decode = matches.is_present("hex"); -- GitLab From 2d39ec2c4aaec1cc0f91fcb91734de8f408dc1b2 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Wed, 27 May 2020 14:40:07 +0200 Subject: [PATCH 130/150] Make Get const friendly + Clean the runtime files a bit. (#6132) * Make Get const friendly * Better doc * Grumble * Better doc * Clean runtime files more --- bin/node-template/runtime/src/lib.rs | 2 +- bin/node/runtime/src/lib.rs | 34 +++++++++------ bin/node/testing/src/genesis.rs | 8 ++-- frame/democracy/src/tests.rs | 2 +- frame/grandpa/src/mock.rs | 2 +- frame/offences/benchmarking/src/mock.rs | 2 +- frame/offences/src/mock.rs | 2 +- frame/scheduler/src/lib.rs | 2 +- frame/support/src/lib.rs | 55 +++++++++++++++++++++++-- frame/system/src/lib.rs | 2 +- primitives/arithmetic/src/per_things.rs | 27 ++++++++---- 11 files changed, 103 insertions(+), 35 deletions(-) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index 55fa4cd4aa..68d4eeeb7a 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -128,7 +128,7 @@ parameter_types! { pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); /// Assume 10% of weight for average on_initialize calls. - pub const MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() + pub MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() .saturating_sub(Perbill::from_percent(10)) * MaximumBlockWeight::get(); pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; pub const Version: RuntimeVersion = VERSION; diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index a3723f049a..229aa3a9be 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -40,7 +40,7 @@ pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Index, Moment}; use sp_api::impl_runtime_apis; use sp_runtime::{ - Permill, Perbill, Perquintill, Percent, ApplyExtrinsicResult, + Permill, Perbill, Perquintill, Percent, PerThing, ApplyExtrinsicResult, impl_opaque_keys, generic, create_runtime_str, ModuleId, }; use sp_runtime::curve::PiecewiseLinear; @@ -65,11 +65,11 @@ use static_assertions::const_assert; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -pub use pallet_timestamp::Call as TimestampCall; +#[cfg(any(feature = "std", test))] pub use pallet_balances::Call as BalancesCall; +#[cfg(any(feature = "std", test))] pub use frame_system::Call as SystemCall; -pub use pallet_contracts::Gas; -pub use frame_support::StorageValue; +#[cfg(any(feature = "std", test))] pub use pallet_staking::StakerStatus; /// Implementations of some helper traits passed into runtime modules as associated types. @@ -126,18 +126,22 @@ impl OnUnbalanced for DealWithFees { } } +const AVERAGE_ON_INITIALIZE_WEIGHT: Perbill = Perbill::from_percent(10); parameter_types! { pub const BlockHashCount: BlockNumber = 2400; /// We allow for 2 seconds of compute with a 6 second average block time. pub const MaximumBlockWeight: Weight = 2 * WEIGHT_PER_SECOND; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); /// Assume 10% of weight for average on_initialize calls. - pub const MaximumExtrinsicWeight: Weight = AvailableBlockRatio::get() - .saturating_sub(Perbill::from_percent(10)) * MaximumBlockWeight::get(); + pub MaximumExtrinsicWeight: Weight = + AvailableBlockRatio::get().saturating_sub(AVERAGE_ON_INITIALIZE_WEIGHT) + * MaximumBlockWeight::get(); pub const MaximumBlockLength: u32 = 5 * 1024 * 1024; pub const Version: RuntimeVersion = VERSION; } +const_assert!(AvailableBlockRatio::get().deconstruct() >= AVERAGE_ON_INITIALIZE_WEIGHT.deconstruct()); + impl frame_system::Trait for Runtime { type Origin = Origin; type Call = Call; @@ -183,7 +187,7 @@ impl pallet_utility::Trait for Runtime { } parameter_types! { - pub const MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); + pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); } impl pallet_scheduler::Trait for Runtime { @@ -229,10 +233,16 @@ impl pallet_balances::Trait for Runtime { parameter_types! { pub const TransactionByteFee: Balance = 10 * MILLICENTS; - // for a sane configuration, this should always be less than `AvailableBlockRatio`. pub const TargetBlockFullness: Perquintill = Perquintill::from_percent(25); } +// for a sane configuration, this should always be less than `AvailableBlockRatio`. +const_assert!( + TargetBlockFullness::get().deconstruct() < + (AvailableBlockRatio::get().deconstruct() as ::Inner) + * (::ACCURACY / ::ACCURACY as ::Inner) +); + impl pallet_transaction_payment::Trait for Runtime { type Currency = Balances; type OnTransactionPayment = DealWithFees; @@ -399,17 +409,17 @@ impl pallet_collective::Trait for Runtime { type MaxProposals = CouncilMaxProposals; } -const DESIRED_MEMBERS: u32 = 13; parameter_types! { pub const CandidacyBond: Balance = 10 * DOLLARS; pub const VotingBond: Balance = 1 * DOLLARS; pub const TermDuration: BlockNumber = 7 * DAYS; - pub const DesiredMembers: u32 = DESIRED_MEMBERS; + pub const DesiredMembers: u32 = 13; pub const DesiredRunnersUp: u32 = 7; pub const ElectionsPhragmenModuleId: LockIdentifier = *b"phrelect"; } + // Make sure that there are no more than `MAX_MEMBERS` members elected via phragmen. -const_assert!(DESIRED_MEMBERS <= pallet_collective::MAX_MEMBERS); +const_assert!(DesiredMembers::get() <= pallet_collective::MAX_MEMBERS); impl pallet_elections_phragmen::Trait for Runtime { type ModuleId = ElectionsPhragmenModuleId; @@ -586,7 +596,7 @@ impl pallet_im_online::Trait for Runtime { } parameter_types! { - pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } impl pallet_offences::Trait for Runtime { diff --git a/bin/node/testing/src/genesis.rs b/bin/node/testing/src/genesis.rs index d9c7e24709..2bbae96cf4 100644 --- a/bin/node/testing/src/genesis.rs +++ b/bin/node/testing/src/genesis.rs @@ -23,7 +23,7 @@ use sp_keyring::{Ed25519Keyring, Sr25519Keyring}; use node_runtime::{ GenesisConfig, BalancesConfig, SessionConfig, StakingConfig, SystemConfig, GrandpaConfig, IndicesConfig, ContractsConfig, SocietyConfig, WASM_BINARY, - AccountId, + AccountId, StakerStatus, }; use node_runtime::constants::currency::*; use sp_core::ChangesTrieConfiguration; @@ -87,9 +87,9 @@ pub fn config_endowed( }), pallet_staking: Some(StakingConfig { stakers: vec![ - (dave(), alice(), 111 * DOLLARS, pallet_staking::StakerStatus::Validator), - (eve(), bob(), 100 * DOLLARS, pallet_staking::StakerStatus::Validator), - (ferdie(), charlie(), 100 * DOLLARS, pallet_staking::StakerStatus::Validator) + (dave(), alice(), 111 * DOLLARS, StakerStatus::Validator), + (eve(), bob(), 100 * DOLLARS, StakerStatus::Validator), + (ferdie(), charlie(), 100 * DOLLARS, StakerStatus::Validator) ], validator_count: 3, minimum_validator_count: 0, diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index c567aec0b6..103ac6a84b 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -110,7 +110,7 @@ impl frame_system::Trait for Test { type OnKilledAccount = (); } parameter_types! { - pub const MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); + pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); } impl pallet_scheduler::Trait for Test { type Event = Event; diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index e429212cef..08329fbb70 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -232,7 +232,7 @@ impl staking::Trait for Test { } parameter_types! { - pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } impl offences::Trait for Test { diff --git a/frame/offences/benchmarking/src/mock.rs b/frame/offences/benchmarking/src/mock.rs index 15b46fc194..28263a5292 100644 --- a/frame/offences/benchmarking/src/mock.rs +++ b/frame/offences/benchmarking/src/mock.rs @@ -187,7 +187,7 @@ impl pallet_im_online::Trait for Test { } parameter_types! { - pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } impl pallet_offences::Trait for Test { diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index b3f35e0171..30d2409a00 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -122,7 +122,7 @@ impl frame_system::Trait for Runtime { } parameter_types! { - pub const OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); + pub OffencesWeightSoftLimit: Weight = Perbill::from_percent(60) * MaximumBlockWeight::get(); } impl Trait for Runtime { diff --git a/frame/scheduler/src/lib.rs b/frame/scheduler/src/lib.rs index 4fefe12a8e..687fe46d16 100644 --- a/frame/scheduler/src/lib.rs +++ b/frame/scheduler/src/lib.rs @@ -515,7 +515,7 @@ mod tests { type Event = (); } parameter_types! { - pub const MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); + pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * MaximumBlockWeight::get(); } impl Trait for Test { type Event = (); diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 68d56ee955..471dd72a74 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -84,27 +84,62 @@ pub use sp_runtime::{self, ConsensusEngineId, print, traits::Printable}; #[derive(Debug)] pub enum Never {} -/// Macro for easily creating a new implementation of the `Get` trait. Use similarly to -/// how you would declare a `const`: +/// Macro for easily creating a new implementation of the `Get` trait. If `const` token is used, the +/// rhs of the expression must be `const`-only, and get is implemented as `const`: /// -/// ```no_compile +/// ``` +/// # use frame_support::traits::Get; +/// # use frame_support::parameter_types; +/// // This function cannot be used in a const context. +/// fn non_const_expression() -> u64 { 99 } +/// +/// const FIXED_VALUE: u64 = 10; /// parameter_types! { -/// pub const Argument: u64 = 42; +/// pub const Argument: u64 = 42 + FIXED_VALUE; +/// pub OtherArgument: u64 = non_const_expression(); /// } +/// /// trait Config { /// type Parameter: Get; +/// type OtherParameter: Get; /// } +/// /// struct Runtime; /// impl Config for Runtime { /// type Parameter = Argument; +/// type OtherParameter = OtherArgument; /// } /// ``` +/// +/// Invalid example: +/// +/// ```compile_fail +/// # use frame_support::traits::Get; +/// # use frame_support::parameter_types; +/// // This function cannot be used in a const context. +/// fn non_const_expression() -> u64 { 99 } +/// +/// parameter_types! { +/// pub const Argument: u64 = non_const_expression(); +/// } +/// ``` + #[macro_export] macro_rules! parameter_types { ( $( #[ $attr:meta ] )* $vis:vis const $name:ident: $type:ty = $value:expr; $( $rest:tt )* + ) => ( + $( #[ $attr ] )* + $vis struct $name; + $crate::parameter_types!{IMPL_CONST $name , $type , $value} + $crate::parameter_types!{ $( $rest )* } + ); + ( + $( #[ $attr:meta ] )* + $vis:vis $name:ident: $type:ty = $value:expr; + $( $rest:tt )* ) => ( $( #[ $attr ] )* $vis struct $name; @@ -112,6 +147,18 @@ macro_rules! parameter_types { $crate::parameter_types!{ $( $rest )* } ); () => (); + (IMPL_CONST $name:ident , $type:ty , $value:expr) => { + impl $name { + pub const fn get() -> $type { + $value + } + } + impl> $crate::traits::Get for $name { + fn get() -> I { + I::from($value) + } + } + }; (IMPL $name:ident , $type:ty , $value:expr) => { impl $name { pub fn get() -> $type { diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 4fa826ce89..8360f6c4cb 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -1877,7 +1877,7 @@ pub(crate) mod tests { pub const MaximumExtrinsicWeight: Weight = 768; pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75); pub const MaximumBlockLength: u32 = 1024; - pub const Version: RuntimeVersion = RuntimeVersion { + pub Version: RuntimeVersion = RuntimeVersion { spec_name: sp_version::create_runtime_str!("test"), impl_name: sp_version::create_runtime_str!("system-test"), authoring_version: 1, diff --git a/primitives/arithmetic/src/per_things.rs b/primitives/arithmetic/src/per_things.rs index b50b35f7af..cf5aa6e4cb 100644 --- a/primitives/arithmetic/src/per_things.rs +++ b/primitives/arithmetic/src/per_things.rs @@ -383,7 +383,6 @@ macro_rules! implement_per_thing { impl $name { /// From an explicitly defined number of parts per maximum of the type. /// - /// This can be called at compile time. // needed only for peru16. Since peru16 is the only type in which $max == // $type::max_value(), rustc is being a smart-a** here by warning that the comparison // is not needed. @@ -399,9 +398,9 @@ macro_rules! implement_per_thing { Self(([x, 100][(x > 100) as usize] as $upper_type * $max as $upper_type / 100) as $type) } - /// See [`PerThing::one`]. - pub fn one() -> Self { - ::one() + /// See [`PerThing::one`] + pub const fn one() -> Self { + Self::from_parts($max) } /// See [`PerThing::is_one`]. @@ -410,8 +409,8 @@ macro_rules! implement_per_thing { } /// See [`PerThing::zero`]. - pub fn zero() -> Self { - ::zero() + pub const fn zero() -> Self { + Self::from_parts(0) } /// See [`PerThing::is_zero`]. @@ -420,8 +419,8 @@ macro_rules! implement_per_thing { } /// See [`PerThing::deconstruct`]. - pub fn deconstruct(self) -> $type { - PerThing::deconstruct(self) + pub const fn deconstruct(self) -> $type { + self.0 } /// See [`PerThing::square`]. @@ -1130,6 +1129,18 @@ macro_rules! implement_per_thing { 1, ); } + + #[test] + #[allow(unused)] + fn const_fns_work() { + const C1: $name = $name::from_percent(50); + const C2: $name = $name::one(); + const C3: $name = $name::zero(); + const C4: $name = $name::from_parts(1); + + // deconstruct is also const, hence it can be called in const rhs. + const C5: bool = C1.deconstruct() == 0; + } } }; } -- GitLab From 993e2e46fc3173acf18c00a00a6807458336675b Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 27 May 2020 15:53:07 +0200 Subject: [PATCH 131/150] Peerset cleanup (#6078) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move methods from Peerset to peers structs * Remove priority_only from peersstate * Refactor PSM * Don't test private fields * Update sc_network * Remove wrong comment * Also fix small stupidity when setting reserved_only * Put back priority_group * Restore priority groups as before * Apply suggestions from code review Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Do the reserved only change * Update client/peerset/src/lib.rs Co-authored-by: Arkadiy Paronyan * Use HashSet::difference Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: Arkadiy Paronyan --- client/peerset/src/lib.rs | 185 +++++++++---- client/peerset/src/peersstate.rs | 461 +++++++++---------------------- client/peerset/tests/fuzz.rs | 4 +- 3 files changed, 277 insertions(+), 373 deletions(-) diff --git a/client/peerset/src/lib.rs b/client/peerset/src/lib.rs index e5e8ec826f..a224965035 100644 --- a/client/peerset/src/lib.rs +++ b/client/peerset/src/lib.rs @@ -182,9 +182,13 @@ pub struct PeersetConfig { /// errors. #[derive(Debug)] pub struct Peerset { + /// Underlying data structure for the nodes's states. data: peersstate::PeersState, /// If true, we only accept reserved nodes. reserved_only: bool, + /// Lists of nodes that don't occupy slots and that we should try to always be connected to. + /// Is kept in sync with the list of reserved nodes in [`Peerset::data`]. + priority_groups: HashMap>, /// Receiver for messages from the `PeersetHandle` and from `tx`. rx: TracingUnboundedReceiver, /// Sending side of `rx`. @@ -209,17 +213,18 @@ impl Peerset { let now = Instant::now(); let mut peerset = Peerset { - data: peersstate::PeersState::new(config.in_peers, config.out_peers, config.reserved_only), + data: peersstate::PeersState::new(config.in_peers, config.out_peers), tx, rx, reserved_only: config.reserved_only, + priority_groups: config.priority_groups.clone().into_iter().collect(), message_queue: VecDeque::new(), created: now, latest_time_update: now, }; - for (group, nodes) in config.priority_groups { - peerset.data.set_priority_group(&group, nodes); + for node in config.priority_groups.into_iter().flat_map(|(_, l)| l) { + peerset.data.add_no_slot_node(node); } for peer_id in config.bootnodes { @@ -235,61 +240,92 @@ impl Peerset { } fn on_add_reserved_peer(&mut self, peer_id: PeerId) { - let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); - reserved.insert(peer_id); - self.data.set_priority_group(RESERVED_NODES, reserved); - self.alloc_slots(); + self.on_add_to_priority_group(RESERVED_NODES, peer_id); } fn on_remove_reserved_peer(&mut self, peer_id: PeerId) { - let mut reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); - reserved.remove(&peer_id); - self.data.set_priority_group(RESERVED_NODES, reserved); - match self.data.peer(&peer_id) { - peersstate::Peer::Connected(peer) => { - if self.reserved_only { - peer.disconnect(); - self.message_queue.push_back(Message::Drop(peer_id)); - } - } - peersstate::Peer::NotConnected(_) => {}, - peersstate::Peer::Unknown(_) => {}, - } + self.on_remove_from_priority_group(RESERVED_NODES, peer_id); } fn on_set_reserved_only(&mut self, reserved_only: bool) { self.reserved_only = reserved_only; - self.data.set_priority_only(reserved_only); if self.reserved_only { - // Disconnect non-reserved nodes. - let reserved = self.data.get_priority_group(RESERVED_NODES).unwrap_or_default(); + // Disconnect all the nodes that aren't reserved. for peer_id in self.data.connected_peers().cloned().collect::>().into_iter() { + if self.priority_groups.get(RESERVED_NODES).map_or(false, |g| g.contains(&peer_id)) { + continue; + } + let peer = self.data.peer(&peer_id).into_connected() .expect("We are enumerating connected peers, therefore the peer is connected; qed"); - if !reserved.contains(&peer_id) { - peer.disconnect(); - self.message_queue.push_back(Message::Drop(peer_id)); - } + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); } + } else { self.alloc_slots(); } } fn on_set_priority_group(&mut self, group_id: &str, peers: HashSet) { - self.data.set_priority_group(group_id, peers); - self.alloc_slots(); + // Determine the difference between the current group and the new list. + let (to_insert, to_remove) = { + let current_group = self.priority_groups.entry(group_id.to_owned()).or_default(); + let to_insert = peers.difference(current_group) + .cloned().collect::>(); + let to_remove = current_group.difference(&peers) + .cloned().collect::>(); + (to_insert, to_remove) + }; + + // Enumerate elements in `peers` not in `current_group`. + for peer_id in &to_insert { + // We don't call `on_add_to_priority_group` here in order to avoid calling + // `alloc_slots` all the time. + self.priority_groups.entry(group_id.to_owned()).or_default().insert(peer_id.clone()); + self.data.add_no_slot_node(peer_id.clone()); + } + + // Enumerate elements in `current_group` not in `peers`. + for peer in to_remove { + self.on_remove_from_priority_group(group_id, peer); + } + + if !to_insert.is_empty() { + self.alloc_slots(); + } } fn on_add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { - self.data.add_to_priority_group(group_id, peer_id); + self.priority_groups.entry(group_id.to_owned()).or_default().insert(peer_id.clone()); + self.data.add_no_slot_node(peer_id); self.alloc_slots(); } fn on_remove_from_priority_group(&mut self, group_id: &str, peer_id: PeerId) { - self.data.remove_from_priority_group(group_id, &peer_id); - self.alloc_slots(); + if let Some(priority_group) = self.priority_groups.get_mut(group_id) { + if !priority_group.remove(&peer_id) { + // `PeerId` wasn't in the group in the first place. + return; + } + } else { + // Group doesn't exist, so the `PeerId` can't be in it. + return; + } + + // If that `PeerId` isn't in any other group, then it is no longer no-slot-occupying. + if !self.priority_groups.values().any(|l| l.contains(&peer_id)) { + self.data.remove_no_slot_node(&peer_id); + } + + // Disconnect the peer if necessary. + if group_id != RESERVED_NODES && self.reserved_only { + if let peersstate::Peer::Connected(peer) = self.data.peer(&peer_id) { + peer.disconnect(); + self.message_queue.push_back(Message::Drop(peer_id)); + } + } } fn on_report_peer(&mut self, peer_id: PeerId, change: ReputationChange) { @@ -376,25 +412,82 @@ impl Peerset { fn alloc_slots(&mut self) { self.update_time(); - // Try to grab the next node to attempt to connect to. - while let Some(next) = { - if self.reserved_only { - self.data.priority_not_connected_peer_from_group(RESERVED_NODES) - } else { - self.data.priority_not_connected_peer() - } - } { + // Try to connect to all the reserved nodes that we are not connected to. + loop { + let next = { + let data = &mut self.data; + self.priority_groups + .get(RESERVED_NODES) + .into_iter() + .flatten() + .filter(move |n| { + data.peer(n).into_connected().is_none() + }) + .next() + .cloned() + }; + + let next = match next { + Some(n) => n, + None => break, + }; + + let next = match self.data.peer(&next) { + peersstate::Peer::Unknown(n) => n.discover(), + peersstate::Peer::NotConnected(n) => n, + peersstate::Peer::Connected(_) => { + debug_assert!(false, "State inconsistency: not connected state"); + break; + } + }; + match next.try_outgoing() { Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), Err(_) => break, // No more slots available. } } + // Nothing more to do if we're in reserved mode. + if self.reserved_only { + return; + } + + // Try to connect to all the nodes in priority groups and that we are not connected to. loop { - if self.reserved_only { - break + let next = { + let data = &mut self.data; + self.priority_groups + .values() + .flatten() + .filter(move |n| { + data.peer(n).into_connected().is_none() + }) + .next() + .cloned() + }; + + let next = match next { + Some(n) => n, + None => break, + }; + + let next = match self.data.peer(&next) { + peersstate::Peer::Unknown(n) => n.discover(), + peersstate::Peer::NotConnected(n) => n, + peersstate::Peer::Connected(_) => { + debug_assert!(false, "State inconsistency: not connected state"); + break; + } + }; + + match next.try_outgoing() { + Ok(conn) => self.message_queue.push_back(Message::Connect(conn.into_peer_id())), + Err(_) => break, // No more slots available. } + } + // Now, we try to connect to non-priority nodes. + loop { // Try to grab the next node to attempt to connect to. let next = match self.data.highest_not_connected_peer() { Some(p) => p, @@ -529,9 +622,9 @@ impl Peerset { self.data.peers().len() } - /// Returns priority group by id. - pub fn get_priority_group(&self, group_id: &str) -> Option> { - self.data.get_priority_group(group_id) + /// Returns the content of a priority group. + pub fn priority_group(&self, group_id: &str) -> Option> { + self.priority_groups.get(group_id).map(|l| l.iter()) } } @@ -583,7 +676,6 @@ mod tests { assert_eq!(message, expected_message); peerset = p; } - assert!(peerset.message_queue.is_empty(), peerset.message_queue); peerset } @@ -713,4 +805,3 @@ mod tests { futures::executor::block_on(fut); } } - diff --git a/client/peerset/src/peersstate.rs b/client/peerset/src/peersstate.rs index 843ec0a360..59879f629e 100644 --- a/client/peerset/src/peersstate.rs +++ b/client/peerset/src/peersstate.rs @@ -14,10 +14,19 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Contains the state storage behind the peerset. +//! Reputation and slots allocation system behind the peerset. +//! +//! The [`PeersState`] state machine is responsible for managing the reputation and allocating +//! slots. It holds a list of nodes, each associated with a reputation value and whether we are +//! connected or not to this node. Thanks to this list, it knows how many slots are occupied. It +//! also holds a list of nodes which don't occupy slots. +//! +//! > Note: This module is purely dedicated to managing slots and reputations. Features such as +//! > for example connecting to some nodes in priority should be added outside of this +//! > module, rather than inside. use libp2p::PeerId; -use log::{error, warn}; +use log::error; use std::{borrow::Cow, collections::{HashSet, HashMap}}; use wasm_timer::Instant; @@ -37,23 +46,24 @@ pub struct PeersState { /// sort, to make the logic easier. nodes: HashMap, - /// Number of non-priority nodes for which the `ConnectionState` is `In`. + /// Number of slot-occupying nodes for which the `ConnectionState` is `In`. num_in: u32, - /// Number of non-priority nodes for which the `ConnectionState` is `In`. + /// Number of slot-occupying nodes for which the `ConnectionState` is `In`. num_out: u32, - /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `In`. + /// Maximum allowed number of slot-occupying nodes for which the `ConnectionState` is `In`. max_in: u32, - /// Maximum allowed number of non-priority nodes for which the `ConnectionState` is `Out`. + /// Maximum allowed number of slot-occupying nodes for which the `ConnectionState` is `Out`. max_out: u32, - /// Priority groups. Each group is identified by a string ID and contains a set of peer IDs. - priority_nodes: HashMap>, - - /// Only allow connections to/from peers in a priority group. - priority_only: bool, + /// List of node identities (discovered or not) that don't occupy slots. + /// + /// Note for future readers: this module is purely dedicated to managing slots. If you are + /// considering adding more features, please consider doing so outside of this module rather + /// than inside. + no_slot_nodes: HashSet, } /// State of a single node that we know about. @@ -106,15 +116,14 @@ impl ConnectionState { impl PeersState { /// Builds a new empty `PeersState`. - pub fn new(in_peers: u32, out_peers: u32, priority_only: bool) -> Self { + pub fn new(in_peers: u32, out_peers: u32) -> Self { PeersState { nodes: HashMap::new(), num_in: 0, num_out: 0, max_in: in_peers, max_out: out_peers, - priority_nodes: HashMap::new(), - priority_only, + no_slot_nodes: HashSet::new(), } } @@ -157,34 +166,6 @@ impl PeersState { .map(|(p, _)| p) } - /// Returns the first priority peer that we are not connected to. - /// - /// If multiple nodes are prioritized, which one is returned is unspecified. - pub fn priority_not_connected_peer(&mut self) -> Option { - let id = self.priority_nodes.values() - .flatten() - .find(|&id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) - .cloned(); - id.map(move |id| NotConnectedPeer { - state: self, - peer_id: Cow::Owned(id), - }) - } - - /// Returns the first priority peer that we are not connected to. - /// - /// If multiple nodes are prioritized, which one is returned is unspecified. - pub fn priority_not_connected_peer_from_group(&mut self, group_id: &str) -> Option { - let id = self.priority_nodes.get(group_id) - .and_then(|group| group.iter() - .find(|&id| self.nodes.get(id).map_or(false, |node| !node.connection_state.is_connected())) - .cloned()); - id.map(move |id| NotConnectedPeer { - state: self, - peer_id: Cow::Owned(id), - }) - } - /// Returns the peer with the highest reputation and that we are not connected to. /// /// If multiple nodes have the same reputation, which one is returned is unspecified. @@ -212,170 +193,40 @@ impl PeersState { } } - fn disconnect(&mut self, peer_id: &PeerId) { - let is_priority = self.is_priority(peer_id); - if let Some(mut node) = self.nodes.get_mut(peer_id) { - if !is_priority { - match node.connection_state { - ConnectionState::In => self.num_in -= 1, - ConnectionState::Out => self.num_out -= 1, - ConnectionState::NotConnected { .. } => - debug_assert!(false, "State inconsistency: disconnecting a disconnected node") - } - } - node.connection_state = ConnectionState::NotConnected { - last_connected: Instant::now(), - }; - } else { - warn!(target: "peerset", "Attempting to disconnect unknown peer {}", peer_id); - } - } - - /// Sets the peer as connected with an outgoing connection. - fn try_outgoing(&mut self, peer_id: &PeerId) -> bool { - let is_priority = self.is_priority(peer_id); - - // We are only accepting connections from priority nodes. - if !is_priority && self.priority_only { - return false; - } - - // Note that it is possible for num_out to be strictly superior to the max, in case we were - // connected to reserved node then marked them as not reserved. - if self.num_out >= self.max_out && !is_priority { - return false; + /// Add a node to the list of nodes that don't occupy slots. + /// + /// Has no effect if the peer was already in the group. + pub fn add_no_slot_node(&mut self, peer_id: PeerId) { + // Reminder: `HashSet::insert` returns false if the node was already in the set + if !self.no_slot_nodes.insert(peer_id.clone()) { + return; } - if let Some(mut peer) = self.nodes.get_mut(peer_id) { - peer.connection_state = ConnectionState::Out; - if !is_priority { - self.num_out += 1; + if let Some(peer) = self.nodes.get_mut(&peer_id) { + match peer.connection_state { + ConnectionState::In => self.num_in -= 1, + ConnectionState::Out => self.num_out -= 1, + ConnectionState::NotConnected { .. } => {}, } - return true; } - false } - /// Tries to accept the peer as an incoming connection. - /// - /// If there are enough slots available, switches the node to "connected" and returns `true`. If - /// the slots are full, the node stays "not connected" and we return `false`. + /// Removes a node from the list of nodes that don't occupy slots. /// - /// Note that reserved nodes don't count towards the number of slots. - fn try_accept_incoming(&mut self, peer_id: &PeerId) -> bool { - let is_priority = self.is_priority(peer_id); - - // We are only accepting connections from priority nodes. - if !is_priority && self.priority_only { - return false; + /// Has no effect if the peer was not in the group. + pub fn remove_no_slot_node(&mut self, peer_id: &PeerId) { + // Reminder: `HashSet::remove` returns false if the node was already not in the set + if !self.no_slot_nodes.remove(peer_id) { + return; } - // Note that it is possible for num_in to be strictly superior to the max, in case we were - // connected to reserved node then marked them as not reserved. - if self.num_in >= self.max_in && !is_priority { - return false; - } - if let Some(mut peer) = self.nodes.get_mut(peer_id) { - peer.connection_state = ConnectionState::In; - if !is_priority { - self.num_in += 1; + if let Some(peer) = self.nodes.get_mut(peer_id) { + match peer.connection_state { + ConnectionState::In => self.num_in += 1, + ConnectionState::Out => self.num_out += 1, + ConnectionState::NotConnected { .. } => {}, } - return true; } - false - } - - /// Sets priority group - pub fn set_priority_group(&mut self, group_id: &str, peers: HashSet) { - // update slot counters - let all_other_groups: HashSet<_> = self.priority_nodes - .iter() - .filter(|(g, _)| *g != group_id) - .flat_map(|(_, id)| id.clone()) - .collect(); - let existing_group = self.priority_nodes.remove(group_id).unwrap_or_default(); - for id in existing_group { - // update slots for nodes that are no longer priority - if !all_other_groups.contains(&id) { - if let Some(peer) = self.nodes.get_mut(&id) { - match peer.connection_state { - ConnectionState::In => self.num_in += 1, - ConnectionState::Out => self.num_out += 1, - ConnectionState::NotConnected { .. } => {}, - } - } - } - } - - for id in &peers { - // update slots for nodes that become priority - if !all_other_groups.contains(id) { - let peer = self.nodes.entry(id.clone()).or_default(); - match peer.connection_state { - ConnectionState::In => self.num_in -= 1, - ConnectionState::Out => self.num_out -= 1, - ConnectionState::NotConnected { .. } => {}, - } - } - } - self.priority_nodes.insert(group_id.into(), peers); - } - - /// Add a peer to a priority group. - pub fn add_to_priority_group(&mut self, group_id: &str, peer_id: PeerId) { - let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); - peers.insert(peer_id); - self.set_priority_group(group_id, peers); - } - - /// Remove a peer from a priority group. - pub fn remove_from_priority_group(&mut self, group_id: &str, peer_id: &PeerId) { - let mut peers = self.priority_nodes.get(group_id).cloned().unwrap_or_default(); - peers.remove(peer_id); - self.set_priority_group(group_id, peers); - } - - /// Get priority group content. - pub fn get_priority_group(&self, group_id: &str) -> Option> { - self.priority_nodes.get(group_id).cloned() - } - - /// Set whether to only allow connections to/from peers in a priority group. - /// Calling this method does not affect any existing connection, e.g. - /// enabling priority only will not disconnect from any non-priority peers - /// we are already connected to, only future incoming/outgoing connection - /// attempts will be affected. - pub fn set_priority_only(&mut self, priority: bool) { - self.priority_only = priority; - } - - /// Check that node is any priority group. - fn is_priority(&self, peer_id: &PeerId) -> bool { - self.priority_nodes.iter().any(|(_, group)| group.contains(peer_id)) - } - - /// Returns the reputation value of the node. - fn reputation(&self, peer_id: &PeerId) -> i32 { - self.nodes.get(peer_id).map_or(0, |p| p.reputation) - } - - /// Sets the reputation of the peer. - fn set_reputation(&mut self, peer_id: &PeerId, value: i32) { - let node = self.nodes - .entry(peer_id.clone()) - .or_default(); - node.reputation = value; - } - - /// Performs an arithmetic addition on the reputation score of that peer. - /// - /// In case of overflow, the value will be capped. - /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. - fn add_reputation(&mut self, peer_id: &PeerId, modifier: i32) { - let node = self.nodes - .entry(peer_id.clone()) - .or_default(); - node.reputation = node.reputation.saturating_add(modifier); } } @@ -437,7 +288,23 @@ impl<'a> ConnectedPeer<'a> { /// Switches the peer to "not connected". pub fn disconnect(self) -> NotConnectedPeer<'a> { - self.state.disconnect(&self.peer_id); + let is_no_slot_occupy = self.state.no_slot_nodes.contains(&*self.peer_id); + if let Some(mut node) = self.state.nodes.get_mut(&*self.peer_id) { + if !is_no_slot_occupy { + match node.connection_state { + ConnectionState::In => self.state.num_in -= 1, + ConnectionState::Out => self.state.num_out -= 1, + ConnectionState::NotConnected { .. } => + debug_assert!(false, "State inconsistency: disconnecting a disconnected node") + } + } + node.connection_state = ConnectionState::NotConnected { + last_connected: Instant::now(), + }; + } else { + debug_assert!(false, "State inconsistency: disconnecting a disconnected node"); + } + NotConnectedPeer { state: self.state, peer_id: self.peer_id, @@ -446,19 +313,27 @@ impl<'a> ConnectedPeer<'a> { /// Returns the reputation value of the node. pub fn reputation(&self) -> i32 { - self.state.reputation(&self.peer_id) + self.state.nodes.get(&*self.peer_id).map_or(0, |p| p.reputation) } /// Sets the reputation of the peer. pub fn set_reputation(&mut self, value: i32) { - self.state.set_reputation(&self.peer_id, value) + if let Some(node) = self.state.nodes.get_mut(&*self.peer_id) { + node.reputation = value; + } else { + debug_assert!(false, "State inconsistency: set_reputation on an unknown node"); + } } /// Performs an arithmetic addition on the reputation score of that peer. /// /// In case of overflow, the value will be capped. pub fn add_reputation(&mut self, modifier: i32) { - self.state.add_reputation(&self.peer_id, modifier) + if let Some(node) = self.state.nodes.get_mut(&*self.peer_id) { + node.reputation = node.reputation.saturating_add(modifier); + } else { + debug_assert!(false, "State inconsistency: add_reputation on an unknown node"); + } } } @@ -520,16 +395,29 @@ impl<'a> NotConnectedPeer<'a> { /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If /// the slots are full, the node stays "not connected" and we return `Err`. /// - /// Note that priority nodes don't count towards the number of slots. + /// Non-slot-occupying nodes don't count towards the number of slots. pub fn try_outgoing(self) -> Result, NotConnectedPeer<'a>> { - if self.state.try_outgoing(&self.peer_id) { - Ok(ConnectedPeer { - state: self.state, - peer_id: self.peer_id, - }) + let is_no_slot_occupy = self.state.no_slot_nodes.contains(&*self.peer_id); + + // Note that it is possible for num_out to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + if self.state.num_out >= self.state.max_out && !is_no_slot_occupy { + return Err(self); + } + + if let Some(mut peer) = self.state.nodes.get_mut(&*self.peer_id) { + peer.connection_state = ConnectionState::Out; + if !is_no_slot_occupy { + self.state.num_out += 1; + } } else { - Err(self) + debug_assert!(false, "State inconsistency: try_outgoing on an unknown node"); } + + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) } /// Tries to accept the peer as an incoming connection. @@ -537,34 +425,54 @@ impl<'a> NotConnectedPeer<'a> { /// If there are enough slots available, switches the node to "connected" and returns `Ok`. If /// the slots are full, the node stays "not connected" and we return `Err`. /// - /// Note that priority nodes don't count towards the number of slots. + /// Non-slot-occupying nodes don't count towards the number of slots. pub fn try_accept_incoming(self) -> Result, NotConnectedPeer<'a>> { - if self.state.try_accept_incoming(&self.peer_id) { - Ok(ConnectedPeer { - state: self.state, - peer_id: self.peer_id, - }) + let is_no_slot_occupy = self.state.no_slot_nodes.contains(&*self.peer_id); + + // Note that it is possible for num_in to be strictly superior to the max, in case we were + // connected to reserved node then marked them as not reserved. + if self.state.num_in >= self.state.max_in && !is_no_slot_occupy { + return Err(self); + } + + if let Some(mut peer) = self.state.nodes.get_mut(&*self.peer_id) { + peer.connection_state = ConnectionState::In; + if !is_no_slot_occupy { + self.state.num_in += 1; + } } else { - Err(self) + debug_assert!(false, "State inconsistency: try_accept_incoming on an unknown node"); } + + Ok(ConnectedPeer { + state: self.state, + peer_id: self.peer_id, + }) } /// Returns the reputation value of the node. pub fn reputation(&self) -> i32 { - self.state.reputation(&self.peer_id) + self.state.nodes.get(&*self.peer_id).map_or(0, |p| p.reputation) } /// Sets the reputation of the peer. pub fn set_reputation(&mut self, value: i32) { - self.state.set_reputation(&self.peer_id, value) + if let Some(node) = self.state.nodes.get_mut(&*self.peer_id) { + node.reputation = value; + } else { + debug_assert!(false, "State inconsistency: set_reputation on an unknown node"); + } } /// Performs an arithmetic addition on the reputation score of that peer. /// /// In case of overflow, the value will be capped. - /// If the peer is unknown to us, we insert it and consider that it has a reputation of 0. pub fn add_reputation(&mut self, modifier: i32) { - self.state.add_reputation(&self.peer_id, modifier) + if let Some(node) = self.state.nodes.get_mut(&*self.peer_id) { + node.reputation = node.reputation.saturating_add(modifier); + } else { + debug_assert!(false, "State inconsistency: add_reputation on an unknown node"); + } } /// Un-discovers the peer. Removes it from the list. @@ -618,7 +526,7 @@ mod tests { #[test] fn full_slots_in() { - let mut peers_state = PeersState::new(1, 1, false); + let mut peers_state = PeersState::new(1, 1); let id1 = PeerId::random(); let id2 = PeerId::random(); @@ -632,14 +540,14 @@ mod tests { } #[test] - fn priority_node_doesnt_use_slot() { - let mut peers_state = PeersState::new(1, 1, false); + fn no_slot_node_doesnt_use_slot() { + let mut peers_state = PeersState::new(1, 1); let id1 = PeerId::random(); let id2 = PeerId::random(); - peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); - if let Peer::NotConnected(p) = peers_state.peer(&id1) { - assert!(p.try_accept_incoming().is_ok()); + peers_state.add_no_slot_node(id1.clone()); + if let Peer::Unknown(p) = peers_state.peer(&id1) { + assert!(p.discover().try_accept_incoming().is_ok()); } else { panic!() } if let Peer::Unknown(e) = peers_state.peer(&id2) { @@ -649,7 +557,7 @@ mod tests { #[test] fn disconnecting_frees_slot() { - let mut peers_state = PeersState::new(1, 1, false); + let mut peers_state = PeersState::new(1, 1); let id1 = PeerId::random(); let id2 = PeerId::random(); @@ -659,28 +567,9 @@ mod tests { assert!(peers_state.peer(&id2).into_not_connected().unwrap().try_accept_incoming().is_ok()); } - #[test] - fn priority_not_connected_peer() { - let mut peers_state = PeersState::new(25, 25, false); - let id1 = PeerId::random(); - let id2 = PeerId::random(); - - assert!(peers_state.priority_not_connected_peer().is_none()); - peers_state.peer(&id1).into_unknown().unwrap().discover(); - peers_state.peer(&id2).into_unknown().unwrap().discover(); - - assert!(peers_state.priority_not_connected_peer().is_none()); - peers_state.set_priority_group("test", vec![id1.clone()].into_iter().collect()); - assert!(peers_state.priority_not_connected_peer().is_some()); - peers_state.set_priority_group("test", vec![id2.clone(), id2.clone()].into_iter().collect()); - assert!(peers_state.priority_not_connected_peer().is_some()); - peers_state.set_priority_group("test", vec![].into_iter().collect()); - assert!(peers_state.priority_not_connected_peer().is_none()); - } - #[test] fn highest_not_connected_peer() { - let mut peers_state = PeersState::new(25, 25, false); + let mut peers_state = PeersState::new(25, 25); let id1 = PeerId::random(); let id2 = PeerId::random(); @@ -700,87 +589,11 @@ mod tests { } #[test] - fn disconnect_priority_doesnt_panic() { - let mut peers_state = PeersState::new(1, 1, false); + fn disconnect_no_slot_doesnt_panic() { + let mut peers_state = PeersState::new(1, 1); let id = PeerId::random(); - peers_state.set_priority_group("test", vec![id.clone()].into_iter().collect()); - let peer = peers_state.peer(&id).into_not_connected().unwrap().try_outgoing().unwrap(); + peers_state.add_no_slot_node(id.clone()); + let peer = peers_state.peer(&id).into_unknown().unwrap().discover().try_outgoing().unwrap(); peer.disconnect(); } - - #[test] - fn multiple_priority_groups_slot_count() { - let mut peers_state = PeersState::new(1, 1, false); - let id = PeerId::random(); - - if let Peer::Unknown(p) = peers_state.peer(&id) { - assert!(p.discover().try_accept_incoming().is_ok()); - } else { panic!() } - - assert_eq!(peers_state.num_in, 1); - peers_state.set_priority_group("test1", vec![id.clone()].into_iter().collect()); - assert_eq!(peers_state.num_in, 0); - peers_state.set_priority_group("test2", vec![id.clone()].into_iter().collect()); - assert_eq!(peers_state.num_in, 0); - peers_state.set_priority_group("test1", vec![].into_iter().collect()); - assert_eq!(peers_state.num_in, 0); - peers_state.set_priority_group("test2", vec![].into_iter().collect()); - assert_eq!(peers_state.num_in, 1); - } - - #[test] - fn priority_only_mode_ignores_drops_unknown_nodes() { - // test whether connection to/from given peer is allowed - let test_connection = |peers_state: &mut PeersState, id| { - if let Peer::Unknown(p) = peers_state.peer(id) { - p.discover(); - } - - let incoming = if let Peer::NotConnected(p) = peers_state.peer(id) { - p.try_accept_incoming().is_ok() - } else { - panic!() - }; - - if incoming { - peers_state.peer(id).into_connected().map(|p| p.disconnect()); - } - - let outgoing = if let Peer::NotConnected(p) = peers_state.peer(id) { - p.try_outgoing().is_ok() - } else { - panic!() - }; - - if outgoing { - peers_state.peer(id).into_connected().map(|p| p.disconnect()); - } - - incoming || outgoing - }; - - let mut peers_state = PeersState::new(1, 1, true); - let id = PeerId::random(); - - // this is an unknown peer and our peer state is set to only allow - // priority peers so any connection attempt should be denied. - assert!(!test_connection(&mut peers_state, &id)); - - // disabling priority only mode should allow the connection to go - // through. - peers_state.set_priority_only(false); - assert!(test_connection(&mut peers_state, &id)); - - // re-enabling it we should again deny connections from the peer. - peers_state.set_priority_only(true); - assert!(!test_connection(&mut peers_state, &id)); - - // but if we add the peer to a priority group it should be accepted. - peers_state.set_priority_group("TEST_GROUP", vec![id.clone()].into_iter().collect()); - assert!(test_connection(&mut peers_state, &id)); - - // and removing it will cause the connection to once again be denied. - peers_state.remove_from_priority_group("TEST_GROUP", &id); - assert!(!test_connection(&mut peers_state, &id)); - } } diff --git a/client/peerset/tests/fuzz.rs b/client/peerset/tests/fuzz.rs index aa2de56923..6fa29e3d83 100644 --- a/client/peerset/tests/fuzz.rs +++ b/client/peerset/tests/fuzz.rs @@ -46,13 +46,13 @@ fn test_once() { id }).collect(), priority_groups: { - let list = (0 .. Uniform::new_inclusive(0, 2).sample(&mut rng)).map(|_| { + let nodes = (0 .. Uniform::new_inclusive(0, 2).sample(&mut rng)).map(|_| { let id = PeerId::random(); known_nodes.insert(id.clone()); reserved_nodes.insert(id.clone()); id }).collect(); - vec![("reserved".to_owned(), list)] + vec![("foo".to_string(), nodes)] }, reserved_only: Uniform::new_inclusive(0, 10).sample(&mut rng) == 0, in_peers: Uniform::new_inclusive(0, 25).sample(&mut rng), -- GitLab From 0c28a1ea75d04d66525679ebfc906cc68217c67c Mon Sep 17 00:00:00 2001 From: Nikolay Volf Date: Wed, 27 May 2020 18:11:36 +0300 Subject: [PATCH 132/150] Improve logging for transaction pool (#6152) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * improve logging * Update client/transaction-pool/graph/src/validated_pool.rs Co-authored-by: Tomasz Drwięga * address review and make uniform Co-authored-by: Tomasz Drwięga --- client/transaction-pool/graph/src/listener.rs | 15 ++++++++------- .../graph/src/validated_pool.rs | 18 ++++++++++-------- client/transaction-pool/src/revalidation.rs | 14 ++++++++++++-- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/client/transaction-pool/graph/src/listener.rs b/client/transaction-pool/graph/src/listener.rs index cccf542199..2923f2b34a 100644 --- a/client/transaction-pool/graph/src/listener.rs +++ b/client/transaction-pool/graph/src/listener.rs @@ -18,7 +18,7 @@ // along with this program. If not, see . use std::{ - collections::HashMap, hash, + collections::HashMap, hash, fmt::Debug, }; use linked_hash_map::LinkedHashMap; use serde::Serialize; @@ -27,7 +27,7 @@ use log::{debug, trace, warn}; use sp_runtime::traits; /// Extrinsic pool default listener. -pub struct Listener { +pub struct Listener { watchers: HashMap>>, finality_watchers: LinkedHashMap, Vec>, } @@ -35,7 +35,7 @@ pub struct Listener { /// Maximum number of blocks awaiting finality at any time. const MAX_FINALITY_WATCHERS: usize = 512; -impl Default for Listener { +impl Default for Listener { fn default() -> Self { Listener { watchers: Default::default(), @@ -74,7 +74,7 @@ impl Listener { /// New transaction was added to the ready pool or promoted from the future pool. pub fn ready(&mut self, tx: &H, old: Option<&H>) { - trace!(target: "txpool", "[{:?}] Ready (replaced: {:?})", tx, old); + trace!(target: "txpool", "[{:?}] Ready (replaced with {:?})", tx, old); self.fire(tx, |watcher| watcher.ready()); if let Some(old) = old { self.fire(old, |watcher| watcher.usurped(tx.clone())); @@ -89,7 +89,7 @@ impl Listener { /// Transaction was dropped from the pool because of the limit. pub fn dropped(&mut self, tx: &H, by: Option<&H>) { - trace!(target: "txpool", "[{:?}] Dropped (replaced by {:?})", tx, by); + trace!(target: "txpool", "[{:?}] Dropped (replaced with {:?})", tx, by); self.fire(tx, |watcher| match by { Some(t) => watcher.usurped(t.clone()), None => watcher.dropped(), @@ -99,9 +99,9 @@ impl Listener { /// Transaction was removed as invalid. pub fn invalid(&mut self, tx: &H, warn: bool) { if warn { - warn!(target: "txpool", "Extrinsic invalid: {:?}", tx); + warn!(target: "txpool", "[{:?}] Extrinsic invalid", tx); } else { - debug!(target: "txpool", "Extrinsic invalid: {:?}", tx); + debug!(target: "txpool", "[{:?}] Extrinsic invalid", tx); } self.fire(tx, |watcher| watcher.invalid()); } @@ -134,6 +134,7 @@ impl Listener { pub fn finalized(&mut self, block_hash: BlockHash) { if let Some(hashes) = self.finality_watchers.remove(&block_hash) { for hash in hashes { + log::debug!(target: "txpool", "[{:?}] Sent finalization event (block {:?})", hash, block_hash); self.fire(&hash, |s| s.finalized(block_hash)) } } diff --git a/client/transaction-pool/graph/src/validated_pool.rs b/client/transaction-pool/graph/src/validated_pool.rs index 7e8e91efe8..9ab45e3b26 100644 --- a/client/transaction-pool/graph/src/validated_pool.rs +++ b/client/transaction-pool/graph/src/validated_pool.rs @@ -27,7 +27,6 @@ use crate::listener::Listener; use crate::rotator::PoolRotator; use crate::watcher::Watcher; use serde::Serialize; -use log::{debug, warn}; use parking_lot::{Mutex, RwLock}; use sp_runtime::{ @@ -189,11 +188,11 @@ impl ValidatedPool { let ready_limit = &self.options.ready; let future_limit = &self.options.future; - debug!(target: "txpool", "Pool Status: {:?}", status); + log::debug!(target: "txpool", "Pool Status: {:?}", status); if ready_limit.is_exceeded(status.ready, status.ready_bytes) || future_limit.is_exceeded(status.future, status.future_bytes) { - debug!( + log::debug!( target: "txpool", "Enforcing limits ({}/{}kB ready, {}/{}kB future", ready_limit.count, ready_limit.total_bytes / 1024, @@ -209,8 +208,11 @@ impl ValidatedPool { self.rotator.ban(&Instant::now(), removed.iter().map(|x| x.clone())); removed }; + if !removed.is_empty() { + log::debug!(target: "txpool", "Enforcing limits: {} dropped", removed.len()); + } + // run notifications - debug!(target: "txpool", "Enforcing limits: {} dropped", removed.len()); let mut listener = self.listener.write(); for h in &removed { listener.dropped(h, None); @@ -324,7 +326,7 @@ impl ValidatedPool { // we do not want to fail if single transaction import has failed // nor we do want to propagate this error, because it could tx unknown to caller // => let's just notify listeners (and issue debug message) - warn!( + log::warn!( target: "txpool", "[{:?}] Removing invalid transaction from update: {}", hash, @@ -531,14 +533,14 @@ impl ValidatedPool { return vec![]; } - debug!(target: "txpool", "Removing invalid transactions: {:?}", hashes); + log::debug!(target: "txpool", "Removing invalid transactions: {:?}", hashes); // temporarily ban invalid transactions self.rotator.ban(&Instant::now(), hashes.iter().cloned()); let invalid = self.pool.write().remove_subtree(hashes); - debug!(target: "txpool", "Removed invalid transactions: {:?}", invalid); + log::debug!(target: "txpool", "Removed invalid transactions: {:?}", invalid); let mut listener = self.listener.write(); for tx in &invalid { @@ -560,7 +562,7 @@ impl ValidatedPool { /// Notify all watchers that transactions in the block with hash have been finalized pub async fn on_block_finalized(&self, block_hash: BlockHash) -> Result<(), B::Error> { - debug!(target: "txpool", "Attempting to notify watchers of finalization for {}", block_hash); + log::trace!(target: "txpool", "Attempting to notify watchers of finalization for {}", block_hash); self.listener.write().finalized(block_hash); Ok(()) } diff --git a/client/transaction-pool/src/revalidation.rs b/client/transaction-pool/src/revalidation.rs index 33f3a3da47..423ff92ba4 100644 --- a/client/transaction-pool/src/revalidation.rs +++ b/client/transaction-pool/src/revalidation.rs @@ -178,7 +178,7 @@ impl RevalidationWorker { for ext_hash in transactions { // we don't add something that already scheduled for revalidation if self.members.contains_key(&ext_hash) { - log::debug!( + log::trace!( target: "txpool", "[{:?}] Skipped adding for revalidation: Already there.", ext_hash, @@ -245,6 +245,16 @@ impl RevalidationWorker { Some(worker_payload) => { this.best_block = worker_payload.at; this.push(worker_payload); + + if this.members.len() > 0 { + log::debug!( + target: "txpool", + "Updated revalidation queue at {}. Transactions: {:?}", + this.best_block, + this.members, + ); + } + continue; }, // R.I.P. worker! @@ -326,7 +336,7 @@ where /// revalidation is actually done. pub async fn revalidate_later(&self, at: NumberFor, transactions: Vec>) { if transactions.len() > 0 { - log::debug!(target: "txpool", "Added {} transactions to revalidation queue", transactions.len()); + log::debug!(target: "txpool", "Sent {} transactions to revalidation queue", transactions.len()); } if let Some(ref to_worker) = self.background { -- GitLab From 1972b3a7fef2906ce51cc13ba5b9d72b0c6277be Mon Sep 17 00:00:00 2001 From: Shawn Tabrizi Date: Wed, 27 May 2020 19:54:56 +0200 Subject: [PATCH 133/150] Add test for Transaction Payment on zero balance account (#6161) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Test zero balance account with pays::no * Update frame/transaction-payment/src/lib.rs Co-authored-by: Bastian Köcher Co-authored-by: Bastian Köcher --- frame/transaction-payment/src/lib.rs | 57 ++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index c52d698756..55d448bce3 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -331,7 +331,7 @@ mod tests { use super::*; use codec::Encode; use frame_support::{ - impl_outer_dispatch, impl_outer_origin, parameter_types, + impl_outer_dispatch, impl_outer_origin, impl_outer_event, parameter_types, weights::{ DispatchClass, DispatchInfo, PostDispatchInfo, GetDispatchInfo, Weight, WeightToFeePolynomial, WeightToFeeCoefficients, WeightToFeeCoefficient, @@ -358,6 +358,13 @@ mod tests { } } + impl_outer_event! { + pub enum Event for Runtime { + system, + pallet_balances, + } + } + #[derive(Clone, PartialEq, Eq, Debug)] pub struct Runtime; @@ -392,7 +399,7 @@ mod tests { type AccountId = u64; type Lookup = IdentityLookup; type Header = Header; - type Event = (); + type Event = Event; type BlockHashCount = BlockHashCount; type MaximumBlockWeight = MaximumBlockWeight; type DbWeight = (); @@ -414,7 +421,7 @@ mod tests { impl pallet_balances::Trait for Runtime { type Balance = u64; - type Event = (); + type Event = Event; type DustRemoval = (); type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; @@ -518,7 +525,7 @@ mod tests { /// create a transaction info struct from weight. Handy to avoid building the whole struct. pub fn info_from_weight(w: Weight) -> DispatchInfo { - // pays: yes -- class: normal + // pays_fee: Pays::Yes -- class: DispatchClass::Normal DispatchInfo { weight: w, ..Default::default() } } @@ -816,6 +823,8 @@ mod tests { .build() .execute_with(|| { + // So events are emitted + System::set_block_number(10); let len = 10; let pre = ChargeTransactionPayment::::from(5 /* tipped */) .pre_dispatch(&2, CALL, &info_from_weight(100), len) @@ -832,6 +841,14 @@ mod tests { .is_ok() ); assert_eq!(Balances::free_balance(2), 0); + // Transfer Event + assert!(System::events().iter().any(|event| { + event.event == Event::pallet_balances(pallet_balances::RawEvent::Transfer(2, 3, 80)) + })); + // Killed Event + assert!(System::events().iter().any(|event| { + event.event == Event::system(system::RawEvent::KilledAccount(2)) + })); }); } @@ -857,4 +874,36 @@ mod tests { assert_eq!(Balances::free_balance(2), 200 - 5 - 10 - 100 - 5); }); } + + #[test] + fn zero_transfer_on_free_transaction() { + ExtBuilder::default() + .balance_factor(10) + .base_weight(5) + .build() + .execute_with(|| + { + // So events are emitted + System::set_block_number(10); + let len = 10; + let dispatch_info = DispatchInfo { + weight: 100, + pays_fee: Pays::No, + class: DispatchClass::Normal, + }; + let user = 69; + let pre = ChargeTransactionPayment::::from(0) + .pre_dispatch(&user, CALL, &dispatch_info, len) + .unwrap(); + assert_eq!(Balances::total_balance(&user), 0); + assert!( + ChargeTransactionPayment:: + ::post_dispatch(pre, &dispatch_info, &default_post_info(), len, &Ok(())) + .is_ok() + ); + assert_eq!(Balances::total_balance(&user), 0); + // No events for such a scenario + assert_eq!(System::events().len(), 0); + }); + } } -- GitLab From d5336db1b010c33f30ad7d1644038900539c264e Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 27 May 2020 19:55:13 +0200 Subject: [PATCH 134/150] Add a warning when the user passes a legacy PeerId (#6158) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add a warning when the user passes a legacy PeerId * Update client/network/src/config.rs Co-authored-by: Bastian Köcher Co-authored-by: Bastian Köcher --- client/network/src/config.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/client/network/src/config.rs b/client/network/src/config.rs index 394e8fc01a..6c9bd3adb9 100644 --- a/client/network/src/config.rs +++ b/client/network/src/config.rs @@ -272,8 +272,21 @@ pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { /// Splits a Multiaddress into a Multiaddress and PeerId. pub fn parse_addr(mut addr: Multiaddr)-> Result<(PeerId, Multiaddr), ParseErr> { let who = match addr.pop() { - Some(multiaddr::Protocol::P2p(key)) => PeerId::from_multihash(key) - .map_err(|_| ParseErr::InvalidPeerId)?, + Some(multiaddr::Protocol::P2p(key)) => { + if !matches!(key.algorithm(), multiaddr::multihash::Code::Identity) { + // (note: this is the "person bowing" emoji) + log::warn!( + "🙇 You are using the peer ID {}. This peer ID uses a legacy, deprecated \ + representation that will no longer be supported in the future. \ + Please refresh it by performing a RPC query to the appropriate node, \ + by looking at its logs, or by using `subkey inspect-node-key` on its \ + private key.", + bs58::encode(key.as_bytes()).into_string() + ); + } + + PeerId::from_multihash(key).map_err(|_| ParseErr::InvalidPeerId)? + }, _ => return Err(ParseErr::PeerIdMissing), }; -- GitLab From d7058c8c909ccd949f0aea4aa13af49acf019e70 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Wed, 27 May 2020 19:55:54 +0200 Subject: [PATCH 135/150] Improve the log messages printed when a listener closes (#6162) * Improve the log messages printed when a listener closes * Oops, didn't finish the expired listen addrs thing --- client/network/src/discovery.rs | 5 +---- client/network/src/service.rs | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index dd5e093876..f5c293b251 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -62,7 +62,7 @@ use libp2p::swarm::toggle::Toggle; #[cfg(not(target_os = "unknown"))] use libp2p::mdns::{Mdns, MdnsEvent}; use libp2p::multiaddr::Protocol; -use log::{debug, info, trace, warn, error}; +use log::{debug, info, trace, warn}; use std::{cmp, collections::{HashMap, HashSet, VecDeque}, io, time::Duration}; use std::task::{Context, Poll}; use sp_core::hexdisplay::HexDisplay; @@ -488,7 +488,6 @@ impl NetworkBehaviour for DiscoveryBehaviour { } fn inject_expired_listen_addr(&mut self, addr: &Multiaddr) { - info!(target: "sub-libp2p", "No longer listening on {}", addr); for k in self.kademlias.values_mut() { NetworkBehaviour::inject_expired_listen_addr(k, addr) } @@ -507,14 +506,12 @@ impl NetworkBehaviour for DiscoveryBehaviour { } fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { - error!(target: "sub-libp2p", "Error on libp2p listener {:?}: {}", id, err); for k in self.kademlias.values_mut() { NetworkBehaviour::inject_listener_error(k, id, err) } } fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &io::Error>) { - error!(target: "sub-libp2p", "Libp2p listener {:?} closed", id); for k in self.kademlias.values_mut() { NetworkBehaviour::inject_listener_closed(k, id, reason) } diff --git a/client/network/src/service.rs b/client/network/src/service.rs index d9de0d05c4..6256cdd64d 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -1213,7 +1213,7 @@ impl Future for NetworkWorker { } }, Poll::Ready(SwarmEvent::ExpiredListenAddr(addr)) => { - trace!(target: "sub-libp2p", "Libp2p => ExpiredListenAddr({})", addr); + info!(target: "sub-libp2p", "📪 No longer listening on {}", addr); if let Some(metrics) = this.metrics.as_ref() { metrics.listeners_local_addresses.dec(); } @@ -1281,10 +1281,23 @@ impl Future for NetworkWorker { trace!(target: "sub-libp2p", "Libp2p => UnknownPeerUnreachableAddr({}): {}", address, error), Poll::Ready(SwarmEvent::ListenerClosed { reason, addresses }) => { - warn!(target: "sub-libp2p", "Libp2p => ListenerClosed: {:?}", reason); if let Some(metrics) = this.metrics.as_ref() { metrics.listeners_local_addresses.sub(addresses.len() as u64); } + let addrs = addresses.into_iter().map(|a| a.to_string()) + .collect::>().join(", "); + match reason { + Ok(()) => error!( + target: "sub-libp2p", + "📪 Libp2p listener ({}) closed gracefully", + addrs + ), + Err(e) => error!( + target: "sub-libp2p", + "📪 Libp2p listener ({}) closed: {}", + addrs, e + ), + } }, Poll::Ready(SwarmEvent::ListenerError { error }) => { trace!(target: "sub-libp2p", "Libp2p => ListenerError: {}", error); -- GitLab From ac641cd593d794af606e49aca2efd49f66b1d637 Mon Sep 17 00:00:00 2001 From: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Date: Thu, 28 May 2020 11:41:51 +0200 Subject: [PATCH 136/150] Fix Election when ForceNone V1 (#6166) * Clean * Better doc * Better better doc * Again better doc * Fix indemt * Update frame/staking/src/lib.rs * Update frame/staking/src/lib.rs * Better test Co-authored-by: Gavin Wood --- frame/staking/src/lib.rs | 29 +++++++++---- frame/staking/src/tests.rs | 88 +++++++++++++++++++++++++++++++++++--- 2 files changed, 102 insertions(+), 15 deletions(-) diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index 4e9a8918c5..b97469b8e0 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -1288,7 +1288,7 @@ decl_module! { // either current session final based on the plan, or we're forcing. (Self::is_current_session_final() || Self::will_era_be_forced()) { - if let Some(next_session_change) = T::NextNewSession::estimate_next_new_session(now){ + if let Some(next_session_change) = T::NextNewSession::estimate_next_new_session(now) { if let Some(remaining) = next_session_change.checked_sub(&now) { if remaining <= T::ElectionLookahead::get() && !remaining.is_zero() { // create snapshot. @@ -2569,16 +2569,19 @@ impl Module { Forcing::ForceAlways => (), Forcing::NotForcing if era_length >= T::SessionsPerEra::get() => (), _ => { - // not forcing, not a new era either. If final, set the flag. - if era_length + 1 >= T::SessionsPerEra::get() { + // Either `ForceNone`, or `NotForcing && era_length < T::SessionsPerEra::get()`. + if era_length + 1 == T::SessionsPerEra::get() { IsCurrentSessionFinal::put(true); + } else if era_length >= T::SessionsPerEra::get() { + // Should only happen when we are ready to trigger an era but we have ForceNone, + // otherwise previous arm would short circuit. + Self::close_election_window(); } return None }, } // new era. - IsCurrentSessionFinal::put(false); Self::new_era(session_index) } else { // Set initial era @@ -2912,6 +2915,17 @@ impl Module { maybe_new_validators } + + /// Remove all the storage items associated with the election. + fn close_election_window() { + // Close window. + >::put(ElectionStatus::Closed); + // Kill snapshots. + Self::kill_stakers_snapshot(); + // Don't track final session. + IsCurrentSessionFinal::put(false); + } + /// Select the new validator set at the end of the era. /// /// Runs [`try_do_phragmen`] and updates the following storage items: @@ -2933,11 +2947,8 @@ impl Module { exposures, compute, }) = Self::try_do_phragmen() { - // We have chosen the new validator set. Submission is no longer allowed. - >::put(ElectionStatus::Closed); - - // kill the snapshots. - Self::kill_stakers_snapshot(); + // Totally close the election round and data. + Self::close_election_window(); // Populate Stakers and write slot stake. let mut total_stake: BalanceOf = Zero::zero(); diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index f43c6383ea..a241161e11 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -2859,7 +2859,7 @@ mod offchain_phragmen { } #[test] - fn offchain_election_flag_is_triggered() { + fn offchain_window_is_triggered() { ExtBuilder::default() .session_per_era(5) .session_length(10) @@ -2919,16 +2919,13 @@ mod offchain_phragmen { } #[test] - fn offchain_election_flag_is_triggered_when_forcing() { + fn offchain_window_is_triggered_when_forcing() { ExtBuilder::default() .session_per_era(5) .session_length(10) .election_lookahead(3) .build() .execute_with(|| { - run_to_block(7); - assert_session_era!(0, 0); - run_to_block(12); ForceEra::put(Forcing::ForceNew); run_to_block(13); @@ -2936,11 +2933,90 @@ mod offchain_phragmen { run_to_block(17); // instead of 47 assert_eq!(Staking::era_election_status(), ElectionStatus::Open(17)); + + run_to_block(20); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + }) + } + + #[test] + fn offchain_window_is_triggered_when_force_always() { + ExtBuilder::default() + .session_per_era(5) + .session_length(10) + .election_lookahead(3) + .build() + .execute_with(|| { + + ForceEra::put(Forcing::ForceAlways); + run_to_block(16); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + + run_to_block(17); // instead of 37 + assert_eq!(Staking::era_election_status(), ElectionStatus::Open(17)); + + run_to_block(20); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + + run_to_block(26); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + + run_to_block(27); // next one again + assert_eq!(Staking::era_election_status(), ElectionStatus::Open(27)); + }) + } + + #[test] + fn offchain_window_closes_when_forcenone() { + ExtBuilder::default() + .session_per_era(5) + .session_length(10) + .election_lookahead(3) + .build() + .execute_with(|| { + ForceEra::put(Forcing::ForceNone); + + run_to_block(36); + assert_session_era!(3, 0); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + + // opens + run_to_block(37); + assert_eq!(Staking::era_election_status(), ElectionStatus::Open(37)); + assert!(Staking::is_current_session_final()); + assert!(Staking::snapshot_validators().is_some()); + + // closes normally + run_to_block(40); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + assert!(!Staking::is_current_session_final()); + assert!(Staking::snapshot_validators().is_none()); + assert_session_era!(4, 0); + + run_to_block(47); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + assert_session_era!(4, 0); + + run_to_block(57); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + assert_session_era!(5, 0); + + run_to_block(67); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + + // Will not open again as scheduled + run_to_block(87); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + assert_session_era!(8, 0); + + run_to_block(90); + assert_eq!(Staking::era_election_status(), ElectionStatus::Closed); + assert_session_era!(9, 0); }) } #[test] - fn election_on_chain_fallback_works() { + fn offchain_window_on_chain_fallback_works() { ExtBuilder::default().build_and_execute(|| { start_session(1); start_session(2); -- GitLab From 49b15615184fad010749d3e34282f70a3845da34 Mon Sep 17 00:00:00 2001 From: Gavin Wood Date: Thu, 28 May 2020 14:20:33 +0200 Subject: [PATCH 137/150] Update locks on upgrade (#6172) --- frame/vesting/src/lib.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frame/vesting/src/lib.rs b/frame/vesting/src/lib.rs index 371fdca691..d054b78357 100644 --- a/frame/vesting/src/lib.rs +++ b/frame/vesting/src/lib.rs @@ -53,12 +53,11 @@ use codec::{Encode, Decode}; use sp_runtime::{DispatchResult, RuntimeDebug, traits::{ StaticLookup, Zero, AtLeast32Bit, MaybeSerializeDeserialize, Convert }}; -use frame_support::{decl_module, decl_event, decl_storage, decl_error, ensure}; +use frame_support::{decl_module, decl_event, decl_storage, decl_error, ensure, IterableStorageMap}; use frame_support::traits::{ Currency, LockableCurrency, VestingSchedule, WithdrawReason, LockIdentifier, ExistenceRequirement, Get }; - use frame_system::{self as system, ensure_signed}; mod benchmarking; @@ -182,6 +181,13 @@ decl_module! { fn deposit_event() = default; + fn on_runtime_upgrade() -> frame_support::dispatch::Weight { + for (a, _) in Vesting::::iter() { + let _ = Self::update_lock(a); + } + 1_000_000_000_000 + } + /// Unlock any vested funds of the sender account. /// /// The dispatch origin for this call must be _Signed_ and the sender must have funds still -- GitLab From d65e6443c8281ff65fa5d39cbd454afa2624390e Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Thu, 28 May 2020 14:26:11 +0200 Subject: [PATCH 138/150] offchain storage lock (#6010) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat/offchain/storage: add remove interface method * feat/offchain/storeage: add remote to StorageValueRef * feat/offchain/storage: add storage lock * fix/review: Apply suggestions from code review Co-authored-by: Tomasz Drwięga Co-authored-by: Peter Goodspeed-Niklaus * refactor/offchain/storage/lock: introduce `Lockable` trait part 1 of 2 * chore/offchain/rename: _remove -> clean * feat/offchain/storage/lock: add TimeAndBlock based part 2 of 2 * fix/offchain/storage/lock: block and time expiry must be && not || * chore/offchain/storage: minor fmt doc comments * doc/comment: prefer markdown emphasis over CAPS * doc/comment: rewrap multiline module level docs * doc/comment: rephrase * impl sleep_until and use the actual time for the test env * feat/test: add more tests, ignore some sample impl doctests * fix/review: Apply suggestions from code review Co-authored-by: Nikolay Volf * doc/comment: better description * fix/review: Apply suggestions from code review Co-authored-by: Nikolay Volf * chore/storage: lifetime cleanup * fix/cleanup: trait bounds, cargo-spellcheck + extra explanations * fix/doc: periods +- * fix/review: Apply suggestions from code review Co-authored-by: Tomasz Drwięga * cleanup: remove explicit lifetime bound, copy -> clone * fix/review: make trait Lockable contain only static, try_lock should not return Err(Option), * chore/lifetimes: remove a couple of lifetime bounds which the compiler can figure out * refactor: migrate to an instant based * fix/feedback: fix, reduce, rename, docs update pending * docs/reword: adjust to changed code * fix/offchain/testing: timestamp and sleep_until shall not block * chore/lines: lines must < 100 chars * fix/docs: add missing pub field doc comments * refactor/x: try_lock does not need to return an Option<_> * refactor/simplify: a better way of waiting for a lock to resolve * docs: consistency * fix/line: < 100 * fix/doctest/use: avoid crate:: * fix/doctest: * * fix/review: remove unused trait bound * fix/review: pretty by const fn * fix/review: reduce default timeout to 20s * docs: grammar * fix/review: add with_block_deadline * doc: revamp BlockNumberProvider documentation to be less frame centric * chore: fmt * docs: add missing doc comment Co-authored-by: Bernhard Schuster Co-authored-by: Tomasz Drwięga Co-authored-by: Peter Goodspeed-Niklaus Co-authored-by: Nikolay Volf --- client/db/src/offchain.rs | 8 + client/offchain/src/api.rs | 7 + frame/system/src/lib.rs | 10 + primitives/core/src/offchain/mod.rs | 26 +- primitives/core/src/offchain/storage.rs | 5 + primitives/core/src/offchain/testing.rs | 18 +- primitives/io/src/lib.rs | 10 + primitives/runtime/src/offchain/mod.rs | 1 + primitives/runtime/src/offchain/storage.rs | 8 +- .../runtime/src/offchain/storage_lock.rs | 516 ++++++++++++++++++ 10 files changed, 599 insertions(+), 10 deletions(-) create mode 100644 primitives/runtime/src/offchain/storage_lock.rs diff --git a/client/db/src/offchain.rs b/client/db/src/offchain.rs index 651510d6e8..f6a0925a08 100644 --- a/client/db/src/offchain.rs +++ b/client/db/src/offchain.rs @@ -67,6 +67,14 @@ impl sp_core::offchain::OffchainStorage for LocalStorage { self.db.commit(tx); } + fn remove(&mut self, prefix: &[u8], key: &[u8]) { + let key: Vec = prefix.iter().chain(key).cloned().collect(); + let mut tx = Transaction::new(); + tx.remove(columns::OFFCHAIN, &key); + + self.db.commit(tx); + } + fn get(&self, prefix: &[u8], key: &[u8]) -> Option> { let key: Vec = prefix.iter().chain(key).cloned().collect(); self.db.get(columns::OFFCHAIN, &key) diff --git a/client/offchain/src/api.rs b/client/offchain/src/api.rs index 45a82d230c..a7f4ecbc58 100644 --- a/client/offchain/src/api.rs +++ b/client/offchain/src/api.rs @@ -100,6 +100,13 @@ impl OffchainExt for Api { } } + fn local_storage_clear(&mut self, kind: StorageKind, key: &[u8]) { + match kind { + StorageKind::PERSISTENT => self.db.remove(STORAGE_PREFIX, key), + StorageKind::LOCAL => unavailable_yet(LOCAL_DB), + } + } + fn local_storage_compare_and_set( &mut self, kind: StorageKind, diff --git a/frame/system/src/lib.rs b/frame/system/src/lib.rs index 8360f6c4cb..2221b0591d 100644 --- a/frame/system/src/lib.rs +++ b/frame/system/src/lib.rs @@ -114,6 +114,7 @@ use sp_runtime::{ MaybeSerialize, MaybeSerializeDeserialize, MaybeMallocSizeOf, StaticLookup, One, Bounded, Dispatchable, DispatchInfoOf, PostDispatchInfoOf, }, + offchain::storage_lock::BlockNumberProvider, }; use sp_core::{ChangesTrieConfiguration, storage::well_known_keys}; @@ -1268,6 +1269,15 @@ impl Happened for CallKillAccount { } } +impl BlockNumberProvider for Module +{ + type BlockNumber = ::BlockNumber; + + fn current_block_number() -> Self::BlockNumber { + Module::::block_number() + } +} + // Implement StoredMap for a simple single-item, kill-account-on-remove system. This works fine for // storing a single item which is required to not be empty/default for the account to exist. // Anything more complex will need more sophisticated logic. diff --git a/primitives/core/src/offchain/mod.rs b/primitives/core/src/offchain/mod.rs index 1d77e10f59..b2ff355213 100644 --- a/primitives/core/src/offchain/mod.rs +++ b/primitives/core/src/offchain/mod.rs @@ -37,6 +37,9 @@ pub trait OffchainStorage: Clone + Send + Sync { /// Persist a value in storage under given key and prefix. fn set(&mut self, prefix: &[u8], key: &[u8], value: &[u8]); + /// Clear a storage entry under given key and prefix. + fn remove(&mut self, prefix: &[u8], key: &[u8]); + /// Retrieve a value from storage under given key and prefix. fn get(&self, prefix: &[u8], key: &[u8]) -> Option>; @@ -219,7 +222,7 @@ pub struct Duration(u64); impl Duration { /// Create new duration representing given number of milliseconds. - pub fn from_millis(millis: u64) -> Self { + pub const fn from_millis(millis: u64) -> Self { Duration(millis) } @@ -346,9 +349,15 @@ pub trait Externalities: Send { /// Sets a value in the local storage. /// /// Note this storage is not part of the consensus, it's only accessible by - /// offchain worker tasks running on the same machine. It IS persisted between runs. + /// offchain worker tasks running on the same machine. It _is_ persisted between runs. fn local_storage_set(&mut self, kind: StorageKind, key: &[u8], value: &[u8]); + /// Removes a value in the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It _is_ persisted between runs. + fn local_storage_clear(&mut self, kind: StorageKind, key: &[u8]); + /// Sets a value in the local storage if it matches current value. /// /// Since multiple offchain workers may be running concurrently, to prevent @@ -357,7 +366,7 @@ pub trait Externalities: Send { /// Returns `true` if the value has been set, `false` otherwise. /// /// Note this storage is not part of the consensus, it's only accessible by - /// offchain worker tasks running on the same machine. It IS persisted between runs. + /// offchain worker tasks running on the same machine. It _is_ persisted between runs. fn local_storage_compare_and_set( &mut self, kind: StorageKind, @@ -370,7 +379,7 @@ pub trait Externalities: Send { /// /// If the value does not exist in the storage `None` will be returned. /// Note this storage is not part of the consensus, it's only accessible by - /// offchain worker tasks running on the same machine. It IS persisted between runs. + /// offchain worker tasks running on the same machine. It _is_ persisted between runs. fn local_storage_get(&mut self, kind: StorageKind, key: &[u8]) -> Option>; /// Initiates a http request given HTTP verb and the URL. @@ -513,6 +522,10 @@ impl Externalities for Box { (&mut **self).local_storage_set(kind, key, value) } + fn local_storage_clear(&mut self, kind: StorageKind, key: &[u8]) { + (&mut **self).local_storage_clear(kind, key) + } + fn local_storage_compare_and_set( &mut self, kind: StorageKind, @@ -618,6 +631,11 @@ impl Externalities for LimitedExternalities { self.externalities.local_storage_set(kind, key, value) } + fn local_storage_clear(&mut self, kind: StorageKind, key: &[u8]) { + self.check(Capability::OffchainWorkerDbWrite, "local_storage_clear"); + self.externalities.local_storage_clear(kind, key) + } + fn local_storage_compare_and_set( &mut self, kind: StorageKind, diff --git a/primitives/core/src/offchain/storage.rs b/primitives/core/src/offchain/storage.rs index 1826015b0d..52a7bbe857 100644 --- a/primitives/core/src/offchain/storage.rs +++ b/primitives/core/src/offchain/storage.rs @@ -51,6 +51,11 @@ impl OffchainStorage for InMemOffchainStorage { self.storage.insert(key, value.to_vec()); } + fn remove(&mut self, prefix: &[u8], key: &[u8]) { + let key: Vec = prefix.iter().chain(key).cloned().collect(); + self.storage.remove(&key); + } + fn get(&self, prefix: &[u8], key: &[u8]) -> Option> { let key: Vec = prefix.iter().chain(key).cloned().collect(); self.storage.get(&key).cloned() diff --git a/primitives/core/src/offchain/testing.rs b/primitives/core/src/offchain/testing.rs index 5e25e433a3..76cf8915f2 100644 --- a/primitives/core/src/offchain/testing.rs +++ b/primitives/core/src/offchain/testing.rs @@ -73,10 +73,10 @@ pub struct OffchainState { pub persistent_storage: InMemOffchainStorage, /// Local storage pub local_storage: InMemOffchainStorage, - /// Current timestamp (unix millis) - pub timestamp: u64, /// A supposedly random seed. pub seed: [u8; 32], + /// A timestamp simulating the current time. + pub timestamp: Timestamp, } impl OffchainState { @@ -160,11 +160,11 @@ impl offchain::Externalities for TestOffchainExt { } fn timestamp(&mut self) -> Timestamp { - Timestamp::from_unix_millis(self.0.read().timestamp) + self.0.read().timestamp } - fn sleep_until(&mut self, _deadline: Timestamp) { - unimplemented!("not needed in tests so far") + fn sleep_until(&mut self, deadline: Timestamp) { + self.0.write().timestamp = deadline; } fn random_seed(&mut self) -> [u8; 32] { @@ -179,6 +179,14 @@ impl offchain::Externalities for TestOffchainExt { }.set(b"", key, value); } + fn local_storage_clear(&mut self, kind: StorageKind, key: &[u8]) { + let mut state = self.0.write(); + match kind { + StorageKind::LOCAL => &mut state.local_storage, + StorageKind::PERSISTENT => &mut state.persistent_storage, + }.remove(b"", key); + } + fn local_storage_compare_and_set( &mut self, kind: StorageKind, diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs index f28f3e2c95..8d81a84c4c 100644 --- a/primitives/io/src/lib.rs +++ b/primitives/io/src/lib.rs @@ -796,6 +796,16 @@ pub trait Offchain { .local_storage_set(kind, key, value) } + /// Remove a value from the local storage. + /// + /// Note this storage is not part of the consensus, it's only accessible by + /// offchain worker tasks running on the same machine. It IS persisted between runs. + fn local_storage_clear(&mut self, kind: StorageKind, key: &[u8]) { + self.extension::() + .expect("local_storage_clear can be called only in the offchain worker context") + .local_storage_clear(kind, key) + } + /// Sets a value in the local storage if it matches current value. /// /// Since multiple offchain workers may be running concurrently, to prevent diff --git a/primitives/runtime/src/offchain/mod.rs b/primitives/runtime/src/offchain/mod.rs index 427b54468f..fe5844ce30 100644 --- a/primitives/runtime/src/offchain/mod.rs +++ b/primitives/runtime/src/offchain/mod.rs @@ -19,5 +19,6 @@ pub mod http; pub mod storage; +pub mod storage_lock; pub use sp_core::offchain::*; diff --git a/primitives/runtime/src/offchain/storage.rs b/primitives/runtime/src/offchain/storage.rs index f8dcd73fa2..2f62d400c0 100644 --- a/primitives/runtime/src/offchain/storage.rs +++ b/primitives/runtime/src/offchain/storage.rs @@ -50,6 +50,11 @@ impl<'a> StorageValueRef<'a> { }) } + /// Remove the associated value from the storage. + pub fn clear(&mut self) { + sp_io::offchain::local_storage_clear(self.kind, self.key) + } + /// Retrieve & decode the value from storage. /// /// Note that if you want to do some checks based on the value @@ -67,7 +72,8 @@ impl<'a> StorageValueRef<'a> { /// Function `f` should return a new value that we should attempt to write to storage. /// This function returns: /// 1. `Ok(Ok(T))` in case the value has been successfully set. - /// 2. `Ok(Err(T))` in case the value was returned, but it couldn't have been set. + /// 2. `Ok(Err(T))` in case the value was calculated by the passed closure `f`, + /// but it could not be stored. /// 3. `Err(_)` in case `f` returns an error. pub fn mutate(&self, f: F) -> Result, E> where T: codec::Codec, diff --git a/primitives/runtime/src/offchain/storage_lock.rs b/primitives/runtime/src/offchain/storage_lock.rs new file mode 100644 index 0000000000..60bf9f0477 --- /dev/null +++ b/primitives/runtime/src/offchain/storage_lock.rs @@ -0,0 +1,516 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +//! # Off-chain Storage Lock +//! +//! A storage-based lock with a defined expiry time. +//! +//! The lock is using Local Storage and allows synchronizing access to critical +//! section of your code for concurrently running Off-chain Workers. Usage of +//! `PERSISTENT` variant of the storage persists the lock value across a full node +//! restart or re-orgs. +//! +//! A use case for the lock is to make sure that a particular section of the +//! code is only run by one Off-chain Worker at a time. This may include +//! performing a side-effect (i.e. an HTTP call) or alteration of single or +//! multiple Local Storage entries. +//! +//! One use case would be collective updates of multiple data items or append / +//! remove of i.e. sets, vectors which are stored in the off-chain storage DB. +//! +//! ## Example: +//! +//! ```rust +//! # use codec::{Decode, Encode, Codec}; +//! // in your off-chain worker code +//! use sp_runtime::offchain::{ +//! storage::StorageValueRef, +//! storage_lock::{StorageLock, Time}, +//! }; +//! +//! fn append_to_in_storage_vec<'a, T>(key: &'a [u8], _: T) where T: Codec { +//! // `access::lock` defines the storage entry which is used for +//! // persisting the lock in the underlying database. +//! // The entry name _must_ be unique and can be interpreted as a +//! // unique mutex instance reference tag. +//! let mut lock = StorageLock::